首页 > 代码库 > Poj2155Matrix二维线段树
Poj2155Matrix二维线段树
题意: c表示矩阵内01 互换,q表示单点查询。
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1000+5;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int n;char color[maxn<<2][maxn<<2]; void inbuild(int root,int l,int r,int rt) { color[root][rt] = 0; if(l==r) return ; int mid=(l+r)>>1; inbuild(root,lson); inbuild(root,rson); } void build(int l,int r,int rt) { inbuild(rt,1,n,1); if(l==r) return ; int mid=(l+r)>>1; build(lson); build(rson); } void down(int root,int L,int R,int l,int r,int rt) { if(color[root][rt]){ // color[root][rt<<1]^=1; color[root][rt<<1|1]^=1; color[root<<1][rt]^=1; color[root<<1|1][rt]^=1; color[root][rt] =0; } if(L<=l&&r<=R) return ; int mid=(l+r)>>1; if(L<=mid) down(root,L,R,lson); if(R>mid) down(root,L,R,rson); } void inupdate(int root,int L,int R,int l,int r,int rt) { if(L<=l&&r<=R){ color[root][rt]^=1;return ; } int mid=(l+r)>>1; if(color[root][rt]){ color[root][rt<<1] ^=1;color[root][rt<<1|1] ^=1; color[root][rt] =0; } if(L<=mid) inupdate(root,L,R,lson); if(R>mid) inupdate(root,L,R,rson); }void update(int L,int R,int S,int X,int l,int r,int rt){ if(L<=l&&r<=R){ inupdate(rt,S,X,1,n,1);return ; } down(rt,S,X,1,n,1); int mid=(l+r)>>1; if(L<=mid) update(L,R,S,X,lson); if(R>mid) update(L,R,S,X,rson);}int inask(int root,int key,int l,int r,int rt){ if(l==r) return color[root][rt]; int mid=(l+r)>>1; if(color[root][rt]){ color[root][rt<<1] ^=1; color[root][rt<<1|1] ^=1; color[root][rt] = 0; } if(key<=mid) return inask(root,key,lson); else return inask(root,key,rson);}int ask(int L,int S,int l,int r,int rt){ if(l==r){ return inask(rt,S,1,n,1); } int mid=(l+r)>>1; down(rt,S,S,1,n,1); if(L<=mid) return ask(L,S,lson); else return ask(L,S,rson);}int main(){ int T,m; char str[10]; int a,b,c,d; cin>>T; while(T--){ cin>>n>>m; build(1,n,1); for(int i = 0;i<m;i++){ scanf("%s",str); if(str[0]==‘C‘){ scanf("%d%d%d%d",&a,&b,&c,&d); update(a,c,b,d,1,n,1); } else { scanf("%d%d",&a,&b); printf("%d\n",ask(a,b,1,n,1)); } } if(T) cout<<endl; } return 0;}
Poj2155Matrix二维线段树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。