codeforces 292E. Copying Data

input

5 101 2 0 -1 33 1 5 -2 02 51 3 3 32 52 42 11 2 1 42 12 41 4 2 12 2

output

03-1323-1这道题可以用线段树成段跟新做,属于染色一类线段树题目,可以定义两个变量stra,strb。stra表示这一线段是否被a[]数组覆盖,如果没有覆盖,那么stra=0,如果覆盖,那么被a[]覆盖的区间范围是a[stra]~a[stra+k-1],strb同理,只不过记录的是b[]的开始位置。对于操作1,输入x1,y1,k,只要使得区间[y1,y1+k-1]的stra变成x1,strb变成y1.对于操作2,输入x1,在线段树中寻找,如果这一点(即[x1,x1])的stra是0,就输出c[x1],否则输出a[x1+strb-stra].#include<stdio.h>#include<string.h>#define maxn 100006int a[maxn],c[maxn];int st1,st2,x1,y1,k;struct node{int l,r,stra,strb;}b[4*maxn];void build(int l,int r,int i){int mid;b[i].l=l;b[i].r=r;b[i].stra=b[i].strb=0;if(l==r)return;mid=(l+r)/2;build(l,mid,i*2);build(mid+1,r,i*2+1);}void update(int l,int r,int i) //stra=x1,strb=y1;{int mid;if(b[i].stra==x1 && b[i].strb==y1)return;if(b[i].l==l && b[i].r==r){b[i].stra=x1;b[i].strb=y1;return;}if(b[i].stra!=-1){b[i*2].stra=b[i*2+1].stra=b[i].stra;b[i*2].strb=b[i*2+1].strb=b[i].strb;b[i].stra=b[i].strb=-1;}mid=(b[i].l+b[i].r)/2;if(r<=mid)update(l,r,i*2);else if(l>mid) update(l,r,i*2+1);else {update(l,mid,i*2);update(mid+1,r,i*2+1);}}void question(int id,int i){int mid;if(b[i].stra!=-1){st1=b[i].stra;st2=b[i].strb;return;}mid=(b[i].l+b[i].r)/2;if(id<=mid) question(id,i*2);else question(id,i*2+1);}int main(){int n,m,i,j,h,d,e,f,x;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++){scanf("%d",&a[i]);}for(i=1;i<=n;i++){scanf("%d",&c[i]);}build(1,n,1);while(m–){scanf("%d",&h);if(h==1){scanf("%d%d%d",&x1,&y1,&k);update(y1,y1+k-1,1);}else if(h==2){scanf("%d",&x);st1=st2=0;question(x,1);if(st1==0){printf("%d\n",c[x]);continue;}else {printf("%d\n",a[x-st2+st1]);continue;}}}}return 0;}

,也有伤心的,既有令人兴奋的,也有令人灰心的,

codeforces 292E. Copying Data

相关文章:

你感兴趣的文章:

标签云: