BZOJ 1176 Mokia

来源:互联网 发布:mac最新 恢复出厂设置 编辑:程序博客网 时间:2024/05/22 09:49

看起来完全不可做的一道题qwq,cdq强行优化为O(nlogn2)

一个query分成4个

然后时间这一维本来就有序,分治时对x排序,y上用BIT维护前缀和。

另:s好像没用

//QWsin#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=200000+10;const int maxw=2000000+10;int s,w,opcnt;struct OP{    int k,a,b,c,id,t,flag;OP(){}    OP(int k,int a,int b,int id,int f,int t):k(k),a(a),b(b),id(id),t(t),flag(f){}    OP(int k,int a,int b,int c,int id):k(k),a(a),b(b),c(c),id(id){}    inline bool operator < (const OP &rhs)const{        return  a<rhs.a||(a==rhs.a&&(b<rhs.b||(b==rhs.b&&t<rhs.t)));    }}a[maxn],t[maxn];int is_q[maxn];/******BIT******/int C[maxw];#define lowbit(i) ((i)&-(i))inline void updata(int pos,int val){    for(int i=pos;i<=w;i+=lowbit(i)) C[i]+=val; }inline int query(int pos){    int ret=0;    for(int i=pos;i;i-=lowbit(i)) ret+=C[i];    return ret; }int ans[maxn];void solve(int l,int r){    if(l==r) return ;    int mid=(l+r)>>1;    solve(l,mid);solve(mid+1,r);    //t[i].t==1表示在右边     for(int i=l;i<=r;++i) t[i]=a[i],t[i].t=(i>mid?1:0);    sort(t+l,t+r+1);    for(int i=l;i<=r;++i)    {               if(t[i].id==6){            int stop=1;         }        if(t[i].k==1&&t[i].t==0)             updata(t[i].b,t[i].c);        if(t[i].k==2&&t[i].t==1)             ans[t[i].id]+=query(t[i].b)*t[i].flag;      }    for(int i=l;i<=r;++i) if(t[i].k==1&&t[i].t==0) updata(t[i].b,-t[i].c);}int main(){    cin>>s>>w;    int k,A,b,c,d,t;    for(t=1;;++t){        scanf("%d",&k);        if(k==3) break;        if(k==1)         {            scanf("%d%d%d",&A,&b,&c);            a[++opcnt]=OP(k,A,b,c,t);        }        else        {            is_q[t]=1;            scanf("%d%d%d%d",&A,&b,&c,&d);//          ans[t]+=(A-c)*(d-b)*s;            a[++opcnt]=OP(k,c,d,t,1,0);            a[++opcnt]=OP(k,c,b-1,t,-1,0);            a[++opcnt]=OP(k,A-1,d,t,-1,0);            a[++opcnt]=OP(k,A-1,b-1,t,1,0);        }    }    solve(1,opcnt);    for(int i=1;i<=t;++i) if(is_q[i]) printf("%d\n",ans[i]);    return 0;}
0 0
原创粉丝点击