CDQ分治,然而超过内存了
CDQ分治的思想还是很有趣的。
http://www.lydsy.com/JudgeOnline/problem.php?id=2683
/************************************************************** Problem: 2683 User: 1349367067 Language: C++ Result: Accepted Time:7344 ms Memory:45028 kb ****************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 800011 using namespace std; int n; struct Node { int x,y,belong,opt,no,a; }q[N],nq[N]; int num=0,T=0; bool cmp(Node a,Node b) { if (a.x==b.x&&a.y==b.y) return a.opt<b.opt; if (a.x==b.x) return a.y<b.y; return a.x<b.x; } int c[N]; inline int lowbit(int x) {return x&(-x);} int getsum(int x) { int ret=0; while (x) {ret+=c[x];x-=lowbit(x);} return ret; } void update(int x,int a) { while (x<=n) {c[x]+=a;x+=lowbit(x);} } int ans[N]={}; void sov(int l,int r) { if (l==r) return; int mid=(l+r)/2,l1,l2; for (int i=l;i<=r;i++) { if (q[i].no<=mid&&q[i].opt==1) update(q[i].y,q[i].a); if (q[i].no>mid&&q[i].opt==2) ans[q[i].belong]+=q[i].a*getsum(q[i].y); } for (int i=l;i<=r;i++) { if (q[i].no<=mid&&q[i].opt==1) update(q[i].y,-q[i].a); } l1=l;l2=mid+1; for (int i=l;i<=r;i++) { if (q[i].no<=mid) nq[l1++]=q[i]; else nq[l2++]=q[i]; } for (int i=l;i<=r;i++) q[i]=nq[i]; sov(l,mid);sov(mid+1,r); } int main() { scanf("%d",&n); int tem; while (scanf("%d",&tem),tem!=3) { if (tem==1) { int x,y,a;scanf("%d%d%d",&x,&y,&a); num++; q[num].opt=tem; q[num].x=x;q[num].y=y;q[num].a=a; q[num].no=num; } else { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); q[++num].opt=tem;q[num].x=x1-1;q[num].y=y1-1;q[num].a=1;q[num].no=num;q[num].belong=++T; q[++num].opt=tem;q[num].x=x1-1;q[num].y=y2;q[num].a=-1;q[num].no=num;q[num].belong=T; q[++num].opt=tem;q[num].x=x2;q[num].y=y1-1;q[num].a=-1;q[num].no=num;q[num].belong=T; q[++num].opt=tem;q[num].x=x2;q[num].y=y2;q[num].a=1;q[num].no=num;q[num].belong=T; } } sort(q+1,q+num+1,cmp); sov(1,num); for (int i=1;i<=T;i++) printf("%d\n",ans[i]); return 0; }