一个二维线段树的简单题,开始直接更新到了每一个节点,结果悲剧超时,想想也是,肯定会TLE 其实不用跟新每个节点,只用更新到那条线段,然后每次询问的时候也只用只用res^矩形的状态 /* * File: main.cpp * Author: Mi * * Created on 2011年3月30日, 下午2:55 */ #include <cstdlib> #include <stdio.h> #include <algorithm> #define N 1005 using namespace std; /* * */ int res; struct tree_y { int l,r,d; int mid() { return (l+r)>>1; } }; struct tree_x { int l,r; tree_y Y[N*4]; int mid() { return (l+r)>>1; } }X[N*4]; void build_y(tree_x &x,int l,int r,int root) { x.Y[root].l=l; x.Y[root].r=r; x.Y[root].d=0; if(l==r) return ; int mid=x.Y[root].mid(); build_y(x,l,mid,root<<1); build_y(x,mid+1,r,root<<1|1); } void build_x(int l,int r,int root) { build_y(X[root],1,1000,1); X[root].l=l; X[root].r=r; if(l==r) return ; int mid=X[root].mid(); build_x(l,mid,root<<1); build_x(mid+1,r,root<<1|1); } void modify_y(tree_x &x,int yl,int yr,int root) { if(x.Y[root].l==yl&&x.Y[root].r==yr) { x.Y[root].d^=1; return ; } int mid=x.Y[root].mid(); if(yr<=mid) modify_y(x,yl,yr,root<<1); else if(yl>=mid+1) modify_y(x,yl,yr,root<<1|1); else { modify_y(x,yl,mid,root<<1); modify_y(x,mid+1,yr,root<<1|1); } } void modify_x(int xl,int xr,int yl,int yr,int root) { if(X[root].l==xl&&X[root].r==xr) { modify_y(X[root],yl,yr,1); return ; } int mid=X[root].mid(); if(xr<=mid) modify_x(xl,xr,yl,yr,root<<1); else if(xl>=mid+1) modify_x(xl,xr,yl,yr,root<<1|1); else { modify_x(xl,mid,yl,yr,root<<1); modify_x(mid+1,xr,yl,yr,root<<1|1); } } void query_y(tree_x &x,int y,int root) { res^=x.Y[root].d; if(x.Y[root].l==x.Y[root].r) return ; int mid=x.Y[root].mid(); if(y<=mid) query_y(x,y,root<<1); else query_y(x,y,root<<1|1); } void query_x(int x,int y,int root) { query_y(X[root],y,1); if(X[root].l==X[root].r) return ; int mid=X[root].mid(); if(x<=mid) query_x(x,y,root<<1); else query_x(x,y,root<<1|1); } int main(int argc, char** argv) { int t,n,q; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); build_x(1,n,1); while(q--) { char str[2]; scanf("%s",str); if(str[0]=='C') { int xl,yl,xr,yr; scanf("%d%d%d%d",&xl,&yl,&xr,&yr); modify_x(xl,xr,yl,yr,1); } else { res=0; int x,y; scanf("%d%d",&x,&y); query_x(x,y,1); printf("%d/n",res); } } puts(""); } return 0; }