BZOJ2683: 简单题

来源:互联网 发布:摩天手无线鼠标 知乎 编辑:程序博客网 时间:2024/06/05 20:21

BZOJ2683传送门
BZOJ1176几乎一样啊
戳这里–>BZOJ1176

然后这个题 应 该? 要开long long 吧。
(日常打错变量名QAQ。。)

【代码】

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <cmath>#define N 200005#define M 800005#define INF 1<<29using namespace std;typedef long long ll;int read(){    int x=0,f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}int n,tot,numa;ll ans[N],szsz[500005];class Query{    public:        int type,x,y,w,id;    Query(){}    Query(int tt,int xx,int yy,int ww,int ii){        type=tt,x=xx,y=yy,w=ww,id=ii;    }}Q[M],tmp[M];bool operator <(Query a,Query b){    return a.x<b.x||(a.x==b.x&&a.type<b.type);}int lowbit(int x){return x&-x;}void Sum_Up(int x,int y){    for(int i=x;i<=n;i+=lowbit(i)) szsz[i]+=y;}ll query(int x){    ll rtn=0;    for(int i=x;i;i-=lowbit(i)) rtn+=szsz[i];    return rtn;}void Clear(int x){    for(int i=x;i<=n&&szsz[i];i+=lowbit(i)) szsz[i]=0;}void CDQ(int l,int r){    if(l==r) return;    int mid=l+r>>1;CDQ(l,mid);CDQ(mid+1,r);    int p=l,q=mid+1,o=0;    while(p<=mid&&q<=r){        if(Q[p]<Q[q]) {            if(Q[p].type&1) Sum_Up(Q[p].y,Q[p].w);            tmp[o++]=Q[p++];        }        else {            if(Q[q].type==2) ans[Q[q].id]+=query(Q[q].y)*Q[q].w;            tmp[o++]=Q[q++];        }    }    while(p<=mid) tmp[o++]=Q[p++];    while(q<=r) {        if(Q[q].type==2) ans[Q[q].id]+=query(Q[q].y)*Q[q].w;        tmp[o++]=Q[q++];    }    for(int i=0;i<o;i++) Clear(tmp[i].y),Q[i+l]=tmp[i];}int main(){    n=read();    while(1)    {        static int tp,x,y,xx,yy;        tp=read();if(tp==3) break;        x=read(),y=read(),xx=read();        if(tp&1) Q[++tot]=Query(tp,x,y,xx,0);        else {            yy=read();numa++;            Q[++tot]=Query(tp,x-1,y-1,1,numa);Q[++tot]=Query(tp,x-1,yy,-1,numa);            Q[++tot]=Query(tp,xx,y-1,-1,numa);Q[++tot]=Query(tp,xx,yy,1,numa);        }    }    CDQ(1,tot);    for(int i=1;i<=numa;i++) printf("%lld\n",ans[i]);    return 0;}
原创粉丝点击