BZOJ1176

来自蒟蒻XXJ的做题记录

CDQ裸题 入门……

#include<bits/stdc++.h>
using namespace std;
const int MAXQ=160010+10010*4;
const int MAXN=2000010;
typedef long long ll;
inline int in(){
    int a(0);char c=getchar();
    while(c<'0'||c>'9') c-getchar();
    while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
    return a;
}
int s,w;
int cnt,sum;
struct QUE{
    int x,y,d,typ;
    long long tot;
    int k,id;
}que[MAXQ];
ll ans[MAXQ];
ll tree[MAXN];
bool hash[MAXQ];
void change(int pos,int k){
    for(int i=pos;i<=w;i+=(i&-i)) tree[i]+=k;
}
ll ask(int pos){
    int res(0);
    for(int i=pos;i;i-=(i&-i)) res+=tree[i];
    return res;
}
void update(int i){
    que[i].tot=(ll)que[i].x*que[i].y*s;
}
void input(){
    s=in();w=in();
    for(;;){
        int tmp=in();
        if(tmp==3) break;++sum;
        if(tmp==1){
            que[++cnt].x=in();
            que[cnt].y=in();
            que[cnt].d=in();
            que[cnt].typ=0;
        }
        if(tmp==2){
            int x1,y1,x2,y2;
            x1=in();y1=in();x2=in();y2=in();
            que[++cnt].x=x1-1;que[cnt].y=y1-1;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=1;
            que[++cnt].x=x2;que[cnt].y=y2;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=1;
            que[++cnt].x=x1-1;que[cnt].y=y2;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=-1;
            que[++cnt].x=x2;que[cnt].y=y1-1;que[cnt].typ=1;update(cnt);que[cnt].id=sum;que[cnt].k=-1;
            hash[sum]=1;
        }
    }
}
bool cmp1(QUE xx,QUE yy){
    if(xx.typ==yy.typ&&xx.x==yy.x) return xx.y<yy.y;
    else if(xx.typ==yy.typ) return xx.x<yy.x;
    return xx.typ<yy.typ;
}
bool cmp2(QUE xx,QUE yy){
    if(xx.typ==yy.typ&&xx.x==yy.x) return xx.y<yy.y;
    else if(xx.typ==yy.typ) return xx.x<yy.x;
    return xx.typ>yy.typ;
}
void solve(int l,int r){
    if(l==r) return;
    int mid=(l+r)>>1;
    solve(l,mid);
    solve(mid+1,r);
    sort(que+l,que+mid+1,cmp1);
    sort(que+mid+1,que+r+1,cmp2);
    int i=l,j=mid+1;
    while(j<=r&&que[j].typ){
        while(i<=mid&&!que[i].typ&&que[i].x<=que[j].x){
            change(que[i].y,que[i].d);i++;
        }
        que[j].tot+=ask(que[j].y);
        ++j;
    }
    for(int tmp=l;tmp<i;tmp++) change(que[tmp].y,-que[tmp].d);
}
void xxj(){
    solve(1,cnt);
}
void output(){
    for(int i=1;i<=cnt;i++){
        if(!que[i].typ) continue;
        ans[que[i].id]+=que[i].k*que[i].tot;
    }
    for(int i=1;i<=sum;i++){
        if(!hash[i]) continue;
        cout<<ans[i]<<endl;
    }
}
 
int main(){
    input();
    xxj();
    output();
    return 0;
}
posted @ 2017-03-28 16:28  Xiaojian_xiang  阅读(124)  评论(0编辑  收藏  举报