Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define maxn 500005
#define setIO(s) freopen(s".in","r",stdin)
#define mod 19921228
#define ll long long
using namespace std;
vector <int> G[maxn];
struct Node{
int l,r,c,p;
}node[maxn],arr[maxn];
int n;
namespace DATA_Maker{
int C[maxn],L[maxn],R[maxn],P[maxn];
void make(int *a){
int pa,pf,pm,pp;
scanf("%d%d%d%d",&pa,&pf,&pm,&pp);
a[1] = pf % pm;
for(int i = 2;i <= n; ++i) a[i]=((long long)a[i-1]*pp+pa+i)%pm;
}
int main(){
scanf("%d",&n);
make(P); for(int i=1;i<=n;++i) node[i].p=P[i];
make(C); for(int i=1;i<=n;++i) node[i].c=C[i];
make(L); for(int i=1;i<=n;++i) node[i].l=L[i];
make(R); for(int i=1;i<=n;++i) node[i].r=R[i];
}
};
namespace Solve{
int hh[maxn],que[maxn],cc[maxn],cur[maxn],answer[maxn],tl[maxn],tr[maxn];
struct Array{
int A[maxn];
int lowbit(int t){ return t&(-t); }
void update(int pos,int delta){ while(pos<maxn) A[pos]+=delta,pos+=lowbit(pos); }
void add(int l,int r,int k){ update(l,k),update(r+1,-k); }
int query(int x){ if(!x) return 0; int sum=0; while(x>0) sum+=A[x],x-=lowbit(x); return sum; }
}T;
void solve(int x,int y,int l,int r){
if(l>r||x>y) return;
if(l==r){
for(int i=x;i<=y;++i) answer[que[i]]=cc[l];
return;
}
int mid=(l+r)>>1,p=0,q=0,kk=x-1;
for(int i=mid+1;i<=r;++i)
for(int j=0;j<G[i].size();++j) T.add(node[G[i][j]].l,node[G[i][j]].r,1);
for(int i=x;i<=y;++i) {
int delta=cur[que[i]]+T.query(node[que[i]].p);
if(delta>=que[i]) tr[++q]=que[i];
else tl[++p]=que[i],cur[que[i]]=delta;
}
for(int i=mid+1;i<=r;++i)
for(int j=0;j<G[i].size();++j) T.add(node[G[i][j]].l,node[G[i][j]].r,-1);
for(int i=1;i<=p;++i) que[++kk]=tl[i];
for(int i=1;i<=q;++i) que[++kk]=tr[i];
solve(x,x+p-1,l,mid),solve(y-q+1,y,mid+1,r);
}
int main()
{
//=======================================离散化
int cnt=0,mx=0;
for(int i=1;i<=n;++i)
{
hh[++cnt]=node[i].l;
hh[++cnt]=node[i].r;
hh[++cnt]=node[i].p;
}
sort(hh+1,hh+1+cnt);
for(int i=1;i<=n;++i)
{
node[i].p=lower_bound(hh+1,hh+1+cnt,node[i].p)-hh;
node[i].l=lower_bound(hh+1,hh+1+cnt,node[i].l)-hh;
node[i].r=lower_bound(hh+1,hh+1+cnt,node[i].r)-hh;
if(node[i].l>node[i].r)swap(node[i].l,node[i].r);
}
for(int i=1;i<=n;++i) cc[i]=node[i].c;
sort(cc+1,cc+1+n);
for(int i=1;i<=n;++i) node[i].c=lower_bound(cc+1,cc+1+n,node[i].c)-cc;
//========================================离散完毕
for(int i=1;i<=n;++i) G[node[i].c].push_back(i),mx=max(mx,node[i].c);
for(int i=1;i<=n;++i) que[i]=i;
solve(1,n,0,mx);
long long tmp=0;
for(int i=1;i<=n;++i) tmp+=answer[i],tmp%=mod;
printf("%lld",tmp);
}
};
int main(){
//setIO("input");
DATA_Maker::main();
Solve::main();
return 0;
}

  

最新文章

  1. logback笔记
  2. (转)onTouchEvent方法的使用
  3. Regional Changchun Online--Ponds
  4. 洛谷P1198 [JSOI2008]最大数
  5. HDFS之SequenceFile和MapFile
  6. Cocos2d-x 3.0 beta 中加入附加项目,解决无法打开包括文件:“extensions/ExtensionMacros.h”: No such file or directory”
  7. Javascript 常用函数【1】
  8. Qt程序Windows部署前打包方法
  9. QT 线程池 + TCP 小试(一)线程池的简单实现
  10. HDU 3362 Fix
  11. 关于SVN更新注意
  12. 关于dfs+剪枝第一篇:hdu1010
  13. 工作中EF遇到的问题
  14. P1966 火柴排队
  15. leetcode19
  16. hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)
  17. [php]php时间格式化
  18. Android项目结构介绍
  19. Linq使用中的ToList注意事项
  20. 【问题记录】mybatis开启事务方法时,一级缓存可能引发的问题

热门文章

  1. Linux入门学习
  2. 开源Android容器化框架Atlas开发者指南
  3. 怎样验证layer.prompt输入的值为数值型???
  4. Ubuntu14.0 + CUDA9.0 + cudnn7.0 + TensorFlow-gpu1.7.0
  5. 小程序(Wepy)--生成海报图片
  6. 安装SSH、配置SSH无密码登录 ssh localhost
  7. 变量命名规范及str类型
  8. 【codeforces 743E】Vladik and cards
  9. 2015 Multi-University Training Contest 8 hdu 5390 tree
  10. Linux内核源码情景分析-wait()、schedule()