POJ 2155 Matrix 二维线段树+标记永久化?

题意:链接方法:二维线段树+标记永久化解析:题意是比较明朗的,算一下内存发现4000^2也是可以接受的,于是就开始yy二维线段树?对于第一层x的线段树,每个节点开一整棵y线段树。用个二维数组就实现了?不过发现个问题啊,这题怎么pushdown啊,标记传不下去啊。如果给x打个标记那么怎么知道y传那段啊?于是就学了新的东西?标记永久化。本题是单点查询嘛,,标记永久化就应该是把相应的区间直接异或,不用往下传?那查询的时候怎么办呢?只需要在查询的时候把所有路过该点的区间都异或起来就OK了。貌似也挺简单的样子?难道标记永久化的适用就是在标记打不下去的时候?貌似吧。另外这题有坑,不同组数据间有换行,为此还PE了一次。代码:;int t,n,q,ans;char s[5];int sum[N<<2][N<<2];void update2(int L,int R,int l,int r,int rtx,int rty){if(L<=l&&r<=R){sum[rtx][rty]^=1;return;}int mid=(l+r)>>1;if(L>mid)update2(L,R,mid+1,r,rtx,rty<<1|1);else if(R<=mid)update2(L,R,l,mid,rtx,rty<<1);else{update2(L,mid,l,mid,rtx,rty<<1);update2(mid+1,R,mid+1,r,rtx,rty<<1|1);}}void update(int x1,int x2,int y1,int y2,int l,int r,int rt){if(x1<=l&&r<=x2){update2(y1,y2,1,n,rt,1);return;}int mid=(l+r)>>1;if(x1>mid)update(x1,x2,y1,y2,rson);else if(x2<=mid)update(x1,x2,y1,y2,lson);else{update(x1,mid,y1,y2,lson);update(mid+1,x2,y1,y2,rson);}}void query2(int y1,int l,int r,int rtx,int rty){ans^=sum[rtx][rty];if(l==r){return;}int mid=(l+r)>>1;if(y1<=mid)query2(y1,l,mid,rtx,rty<<1);else query2(y1,mid+1,r,rtx,rty<<1|1);}void query(int x1,int y1,int l,int r,int rt){query2(y1,1,n,rt,1);if(l==r){return;}int mid=(l+r)>>1;if(x1<=mid)query(x1,y1,l,mid,rt<<1);else query(x1,y1,mid+1,r,rt<<1|1);}int main(){scanf(“%d”,&t);while(t–){memset(sum,0,sizeof(sum));scanf(“%d%d”,&n,&q);for(int i=1;i<=q;i++){scanf(“%s”,s);if(s[0]==’C’){int x1,y1,x2,y2;scanf(“%d%d%d%d”,&x1,&y1,&x2,&y2);update(x1,x2,y1,y2,1,n,1);}else{ans=0;int x1,y1;scanf(“%d%d”,&x1,&y1);query(x1,y1,1,n,1);printf(“%d\n”,ans);}}printf(“\n”);}}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相反,某天也许你会忽然发现,心早已沦陷。

POJ 2155 Matrix 二维线段树+标记永久化?

相关文章:

你感兴趣的文章:

标签云: