BZOJ 2683 简单题 ——CDQ分治
简单题
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=k;--i) #define maxn 2000005 int sum[maxn]; void add(int x,int f) { // printf("Add %d on %d\n",f,x); for (;x<maxn;x+=x&(-x)) sum[x]+=f; } int gs(int x) { // printf("gs %d ",x); int ret=0; for (;x;x-=x&(-x)) ret+=sum[x]; // printf("= %d\n",ret); return ret; } struct query{ int opt; int x,y,a; int id; void print() { printf("%d %d %d %d %d\n",opt,x,y,a,id); } }a[maxn]; int opt,top=0,x,y,xx,yy,tot,ans[maxn]; bool cmp(query A,query B) {return A.x<B.x;} void CDQ(int l,int r) { if (l==r) return; int mid=l+r>>1; CDQ(l,mid); CDQ(mid+1,r); // printf("CDQ %d %d\n",l,r); // F(i,l,r) a[i].print(); int pl=l; F(i,mid+1,r) if (a[i].opt==2){ // printf("now is %d %d\n",a[i].x,a[i].y); // a[pl].print(); while (a[i].x>=a[pl].x&&pl<=mid) { if (a[pl].opt==1) { add(a[pl].y,a[pl].a); // printf("Add %d on %d\n",a[pl].a,a[pl].y); } pl++; } ans[a[i].id]+=a[i].a*gs(a[i].y); // printf("%d += %d\n",a[i].id,a[i].a*gs(a[i].y)); } F(i,l,pl-1) if (a[i].opt==1) add(a[i].y,-a[i].a); sort(a+l,a+r+1,cmp); // printf("Over\n"); } int main() { scanf("%*d"); while (scanf("%d",&opt)!=EOF&&opt!=3) { switch (opt) { case 1: ++top;scanf("%d%d%d",&a[top].x,&a[top].y,&a[top].a);a[top].opt=1;break; case 2: ++tot; scanf("%d%d%d%d",&x,&y,&xx,&yy); ++top;a[top].id=tot;a[top].x=xx; a[top].y=yy; a[top].a=1; a[top].opt=2; ++top;a[top].id=tot;a[top].x=x-1;a[top].y=y-1; a[top].a=1; a[top].opt=2; ++top;a[top].id=tot;a[top].x=xx; a[top].y=y-1; a[top].a=-1;a[top].opt=2; ++top;a[top].id=tot;a[top].x=x-1; a[top].y=yy; a[top].a=-1;a[top].opt=2; break; } } CDQ(1,top); F(i,1,tot) printf("%d\n",ans[i]); }