记录编号 317635 评测结果 AAAAAAAAAA
题目名称 蝗灾 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 1.898 s
提交时间 2016-10-08 12:07:16 内存使用 15.17 MiB
显示代码纯文本
#include<cstdio>
struct Q{
    int x1,y1,x2,num;
    Q(){}
    Q(int a,int b,int c,int d){
        x1=a;y1=b;x2=c;num=d;
    }
    bool operator <(const Q &B)const{
        return y1<B.y1;
    }
}lst[400005],buf[400005];
void merge(int l,int r){
    int mid=(l+r)>>1;
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r){
        if(lst[i]<lst[j]){
            buf[k]=lst[i];++i;++k;
        }else{
            buf[k]=buf[j];++j;++k;
        }
    }
    while(i<=mid){
        buf[k]=lst[i];++i;++k;
    }
    while(j<=r){
        buf[k]=buf[j];++j;++k;
    }
    for(i=l;i<=r;++i)lst[i]=buf[i];
}
int c[500050];
inline int lowbit(int x){
    return x&(-x);
}
int sum(int x){//printf("S%d\n",x);
    int ans=0;
    for(;x;x-=lowbit(x))ans+=c[x];
    return ans;
}
void add(int x,int w){//printf("A");
    for(;x<500050;x+=lowbit(x))c[x]+=w;
}
int ans[200005];
void solve(int l,int r){//printf("%d %d\n",l,r);
    if(l==r)return;
    int mid=(l+r)>>1;
    solve(l,mid);solve(mid+1,r);
    merge(l,mid);merge(mid+1,r);//printf("-%d %d\n",l,r);
    int pt=l;
    for(int i=mid+1;i<=r;++i){
        while(pt<=mid&&lst[pt].y1<=lst[i].y1){
            if(lst[pt].num==0){
                add(lst[pt].x1,lst[pt].x2);
            }
            pt++;
        }
        if(lst[i].num>0){
            ans[lst[i].num]+=sum(lst[i].x1)-sum(lst[i].x2-1);
        }else if(lst[i].num<0){
            ans[-lst[i].num]-=sum(lst[i].x1)-sum(lst[i].x2-1);
        }
    }
    for(int i=l;i<=mid&&lst[i].y1<=lst[r].y1;++i){
        if(lst[i].num==0)add(lst[i].x1,-lst[i].x2);
    }
}
int main(){
    freopen("locust.in","r",stdin);
    freopen("locust.out","w",stdout);
    int w;scanf("%d",&w);
    int n;scanf("%d",&n);
    int typ,tot=0,qs=0;
    int x1,y1,x2,y2;
    for(int i=1;i<=n;++i){
        scanf("%d",&typ);
        if(typ==1){
            scanf("%d%d%d",&x1,&y1,&x2);
            lst[++tot]=Q(x1+1,y1+1,x2,0);
        }else{
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            qs++;
            lst[++tot]=Q(x2+1,y2+1,x1+1,qs);
            lst[++tot]=Q(x2+1,y1,x1+1,-qs);
        }
    }
    solve(1,tot);
    for(int i=1;i<=qs;++i){
        printf("%d\n",ans[i]);
    }//while(1);
    fclose(stdin);fclose(stdout);
    return 0;
}