zoukankan      html  css  js  c++  java
  • BZOJ 1176/2683 Mokia (三维偏序CDQ+树状数组)

    题目大意:

    洛谷传送门

    三维偏序裸题。。

    每次操作都看成一个三元组$<x,y,t>$,表示$x,y$坐标和操作时间$t $

    询问操作拆成$4$个容斥

    接下来就是$CDQ$了,外层按t排序,回溯时按$x$排序,用树状数组处理$y$这一维即可

     1 #include <vector>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #define N1 201000
     6 #define M1 2001000
     7 #define ll long long
     8 #define dd double
     9 #define inf 0x3f3f3f3f3f3f3f3fll
    10 using namespace std;
    11 
    12 int gint()
    13 {
    14     int ret=0,fh=1;char c=getchar();
    15     while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
    16     while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
    17     return ret*fh;
    18 }
    19 int n,m,ma;
    20 struct BIT{
    21 int s[M1];
    22 void update(int x,int w){ for(int i=x;i<=ma;i+=(i&(-i))) s[i]+=w; }
    23 int query(int x){ int ans=0; for(int i=x;i;i-=(i&(-i))) ans+=s[i]; return ans; }
    24 void clr(int x){ for(int i=x;i<=ma;i+=(i&(-i))) s[i]=0;}
    25 }s;
    26 struct node{int x,y,w,t,ans,p;}a[N1],tmp[N1];
    27 int cmp1(node s1,node s2){ if(s1.x!=s2.x) return s1.x<s2.x; return s1.y<s2.y; }
    28 int cmp2(node s1,node s2){ if(s1.x!=s2.x) return s1.x<s2.x; return s1.y<=s2.y; }
    29 int que[N1],tl;
    30 
    31 void CDQ(int L,int R)
    32 {
    33     if(R-L<=1) return;
    34     int i,j,k,M=(L+R)>>1;
    35     for(i=L,j=M,k=L;k<R;k++)
    36     {
    37         if(a[k].t<M) tmp[i++]=a[k];
    38         else tmp[j++]=a[k];
    39     }
    40     for(k=L;k<R;k++) a[k]=tmp[k];
    41     CDQ(L,M);
    42     for(i=L,j=M;i<M&&j<R;)
    43     {
    44         if(cmp2(a[i],a[j])){ if(!a[i].p) { s.update(a[i].y,a[i].w); que[++tl]=i; } i++; }
    45         else{ if(a[j].p) a[j].ans+=s.query(a[j].y); j++; }
    46     }
    47     while(i<M){ i++; }
    48     while(j<R){ a[j].ans+=s.query(a[j].y); j++; }
    49     while(tl){ s.clr(a[que[tl--]].y); }
    50     CDQ(M,R);
    51     for(i=L,j=M,k=0;i<M&&j<R;)
    52     {
    53         if(cmp2(a[i],a[j])) tmp[++k]=a[i++];
    54         else tmp[++k]=a[j++];
    55     }
    56     while(i<M){ tmp[++k]=a[i++]; }
    57     while(j<R){ tmp[++k]=a[j++]; }
    58     for(k=L;k<R;k++) a[k]=tmp[k-L+1];
    59 }
    60 int f[N1];
    61 
    62 int main()
    63 {
    64     int i,op,xx1,xx2,yy1,yy2,w; op=gint(); ma=gint();
    65     while(scanf("%d",&op)&&op!=3)
    66     {
    67         if(op==1) { n++; a[n].x=gint(); a[n].y=gint(); a[n].w=gint(); a[n].t=n;}
    68         if(op==2)
    69         {
    70             xx1=gint(); yy1=gint(); xx2=gint(); yy2=gint(); m++;
    71             n++; a[n].x=xx1-1; a[n].y=yy1-1; a[n].t=n; a[n].w=m; a[n].p=1;
    72             n++; a[n].x=xx2; a[n].y=yy1-1; a[n].t=n; a[n].w=m; a[n].p=-1;
    73             n++; a[n].x=xx1-1; a[n].y=yy2; a[n].t=n; a[n].w=m; a[n].p=-1;
    74             n++; a[n].x=xx2; a[n].y=yy2; a[n].t=n; a[n].w=m; a[n].p=1;
    75         }
    76     }
    77     sort(a+1,a+n+1,cmp1);
    78     CDQ(1,n+1);
    79     for(i=1;i<=n;i++) 
    80     {
    81         if(!a[i].w) continue;
    82         f[a[i].w]+=a[i].p*a[i].ans;
    83     }
    84     for(i=1;i<=m;i++) printf("%d
    ",f[i]);
    85     return 0;
    86 }
  • 相关阅读:
    CCF-CSP-201803-3 URL映射
    CCF-CSP-201803-2 碰撞的小球
    CCF-CSP-201803-1 跳一跳
    SSH协议基础学习
    关于Kali-linux2019.4系统安装后乱码问题
    git版本控制工具学习--修改分支名字
    Git版本控制工具操作学习系列-克隆项目
    python函数int()转型报错
    Centos关机与重启命令收集学习
    Git commit 提交规范 & 规范校验
  • 原文地址:https://www.cnblogs.com/guapisolo/p/10210406.html
Copyright © 2011-2022 走看看