注意到$b$不变,考虑用归并树来维护这个$b$序列,对于每个节点有序地维护$b$,同时在归并的时候预处理出每个元素在左右儿子里的排名。

在归并树上额外维护区间内$a\geq b$的个数以及赋值标记。

那么在区间赋值的时候,只需要在根节点的$b$数组中做一个二分,然后往下通过预处理的名次数组转移即可,标记下放时也是如此,每次转移复杂度显然是$O(1)$。

时间复杂度$O((n+m)\log n)$。

#include<cstdio>
#include<algorithm>
const int N=100010,M=262150,E=1768950;
int Case,n,m,A,B,C=~(1<<31),i,a[N],b[N],ans,c,d,x,sum;
int st[M],en[M],v[M],tag[M],pl[E],pr[E],pool[E],cur;
void build(int x,int a,int b){
tag[x]=-1;
if(a==b){
st[x]=cur+1;
pool[++cur]=::b[a];
en[x]=cur;
v[x]=::a[a]>=::b[a];
return;
}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
v[x]=v[x<<1]+v[x<<1|1];
int al=st[x<<1],ar=en[x<<1],bl=st[x<<1|1],br=en[x<<1|1];
st[x]=cur+1;
while(al<=ar&&bl<=br)pool[++cur]=pool[al]<pool[bl]?pool[al++]:pool[bl++];
while(al<=ar)pool[++cur]=pool[al++];
while(bl<=br)pool[++cur]=pool[bl++];
en[x]=cur;
al=st[x<<1],bl=st[x<<1|1];
for(int i=st[x];i<=cur;i++){
while(al<=ar&&pool[al]<=pool[i])al++;
while(bl<=br&&pool[bl]<=pool[i])bl++;
pl[i]=al-1,pr[i]=bl-1;
if(pl[i]<st[x<<1])pl[i]=0;
if(pr[i]<st[x<<1|1])pr[i]=0;
}
}
inline void tag1(int x,int p){v[x]=p?p-st[x]+1:0;tag[x]=p;}
inline void pb(int x){
if(tag[x]<0)return;
int p=tag[x];
tag1(x<<1,pl[p]);
tag1(x<<1|1,pr[p]);
tag[x]=-1;
}
void change(int x,int a,int b,int p){
if(c<=a&&b<=d){tag1(x,p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,pl[p]);
if(d>mid)change(x<<1|1,mid+1,b,pr[p]);
v[x]=v[x<<1]+v[x<<1|1];
}
void ask(int x,int a,int b){
if(c<=a&&b<=d){ans+=v[x];return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)ask(x<<1,a,mid);
if(d>mid)ask(x<<1|1,mid+1,b);
v[x]=v[x<<1]+v[x<<1|1];
}
inline int lower(int x){
int l=st[1],r=en[1],mid,t=0;
while(l<=r)if(pool[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int rnd(){
A=(36969+(ans>>3))*(A&65535)+(A>>16);
B=(18000+(ans>>3))*(B&65535)+(B>>16);
return(C&((A<<16)+B))%1000000000;
}
int main(){
for(scanf("%d",&Case);Case--;printf("%d\n",sum)){
scanf("%d%d%d%d",&n,&m,&A,&B);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)scanf("%d",&b[i]);
ans=cur=sum=0;
build(1,1,n);
for(i=1;i<=m;i++){
c=rnd()%n+1,d=rnd()%n+1,x=rnd()+1;
if(c>d)std::swap(c,d);
if((c+d+x)&1)change(1,1,n,lower(x));
else{
ans=0;
ask(1,1,n);
sum=(1LL*ans*i+sum)%1000000007;
}
}
}
return 0;
}

  

HDU5737 : Differencia的更多相关文章

  1. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  2. hdu5737(2016多校联赛第2场D)

    题意:给2组数据a和b数组,每次有2种操作:(+,l,r,x)把a数组第l个到第r个元素全置为x,(?,l,r)查询[l,r]之间哪些位置满足a[i]>=b[i](i>=l &&a ...

  3. HDU 5737 Differencia(归并树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5737 [题目大意] 给出两个序列a和b,要求实现两个操作: 1. 将a序列的一个区间中的所有数改成 ...

  4. Differencia (归并树)

    归并树,与我们原学过的归并排序是一样的原理,但是在那个的基础上进行扩展应用.首先每个节点储存了它每个节点所代表的点的有序序列,还有就是每个点里面包含的所有的b[i]在左右子树的排名辅助更新数据,还有一 ...

  5. hdu5737

    首先思考一个朴素的做法 将b[]维护成一个线段树套有序表,每次修改a[]用线段树+lazy tag 并在线段树的子区间上在有序表中二分更新这段区间中a[i]>=b[i]的值,复杂度O(nlog^ ...

  6. 2016 Multi-University Training Contest 2

    8/13 2016 Multi-University Training Contest 2官方题解 数学 A Acperience(CYD)题意: 给定一个向量,求他减去一个  α(>=0)乘以 ...

  7. 2016 Multi-University Training Contest 2 solutions BY zimpha

    Acperience 展开式子, \(\left\| W-\alpha B \right\|^2=\displaystyle\alpha^2\sum_{i=1}^{n}b_i^2-2\alpha\su ...

随机推荐

  1. ios cell常用属性

    1.设置UITableViewCell的accessoryView 有时候我们需要设置cell的一些样式,比如下图, 这个就是设置了cell的accessory属性的内容,如果我们想在上面显示Swit ...

  2. October 12th 2016 Week 42nd Wednesday

    Passion is momentary; love is enduring. 激情短暂,真爱长久. What is love? And what is real love? We are alway ...

  3. September 24th 2016 Week 39th Saturday

    The worst solitude is to be destitute of sincere friendship. 最大的孤独莫过于没有真诚的友谊. I walk slowly, but I n ...

  4. 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件

    转自:http://www.cnblogs.com/yeahgis/p/3853420.html VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上 ...

  5. Eclipse CDT launch failed.Binary not found in Linux/Ubuntu

    转自:http://blog.csdn.net/abcjennifer/article/details/7573916 Linux下出现launch failed.Binary not found的解 ...

  6. cmd for备忘

    =============参数 /d (参数只能显示当前目录下的目录名字)=================== rem 显示d:\work\目录下与*.txt相匹配的文件(如果报错就%i-> ...

  7. Android接口传递Json数组的处理方式

    public static XTResult<Void> addTravel(String uuid, String travelName, String travelId, String ...

  8. NYOJ题目822画图

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAAHzCAIAAABgzHaKAAAgAElEQVR4nO3dPVLjzBoG0LsJ514IsR

  9. javascript事件与event对象的属性

    javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...

  10. Android 中this、getContext()、getApplicationContext()、getApplication()、getBaseContext() 之间的区别

    : 知之为知之,不知为不知是知也! 使用this, 说明当前类是context的子类,一般是activity application等; this:代表当前,在Activity当中就是代表当前的Act ...