zoukankan      html  css  js  c++  java
  • 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia

     链接

    分析

      三维偏序问题,CDQ分治论文题。

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 
     5 inline int read() {
     6     int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
     7     for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
     8 }
     9 
    10 int ans[10010],W;
    11 struct Que{
    12     int ty,x,y,w,id;
    13     bool operator < (const Que &a) const {
    14         return x == a.x ? ty < a.ty : x < a.x;
    15     }
    16 }A[160000*4+10000+10],B[160000*4+10000+10];
    17 
    18 struct Bit{
    19     int sum[2000010];
    20     void update(int p,int v) {
    21         for (; p<=W; p+=p&(-p)) sum[p] += v;
    22     }
    23     int query(int p) {
    24         int ans = 0;
    25         for (; p; p-=p&(-p)) ans += sum[p];
    26         return ans;
    27     }
    28     void clear(int p) {
    29         for (; p<=W&&sum[p]; p+=p&(-p)) sum[p] = 0;
    30     }
    31 }bit;
    32 
    33 void CDQ(int L,int R) {
    34     if (L == R) return ;
    35     int M = (L + R) >> 1;
    36     CDQ(L,M);
    37     CDQ(M+1,R);
    38     int i = L, j = M + 1,k = L;
    39     while (i <= M && j <= R) {
    40         if (A[i] < A[j]) {
    41             if (A[i].ty == 0) bit.update(A[i].y,A[i].w);
    42             B[k++] = A[i++];
    43         }
    44         else {
    45             if (A[j].ty == 1) ans[A[j].id] += A[j].w * bit.query(A[j].y);
    46             B[k++] = A[j++];
    47         }
    48     }
    49     while (i <= M) B[k++] = A[i++];
    50     while (j <= R) {
    51         ans[A[j].id] += A[j].w * bit.query(A[j].y);
    52         B[k++] = A[j++];
    53     }
    54     for (int i=L; i<=R; ++i) {
    55         bit.clear(A[i].y);
    56         A[i] = B[i];
    57     }
    58 }
    59 int main() {
    60     
    61     W = read();W = read(); // 把W在这里int了一下,然后。。。 
    62     int Index = 0,QueIndex = 0;
    63     
    64     while (1) {    
    65         int opt = read();
    66         if (opt==3) break;
    67         if (opt==1) {
    68             int a = read(),b = read(),val = read();
    69             A[++Index] = (Que){0,a,b,val,0};
    70         }
    71         else {
    72             int a1 = read(),b1 = read(),a2 = read(),b2 = read();
    73             A[++Index] = (Que){1,a1-1,b1-1,1,++QueIndex};
    74             A[++Index] = (Que){1,a1-1,b2,-1,QueIndex};
    75             A[++Index] = (Que){1,a2,b1-1,-1,QueIndex};
    76             A[++Index] = (Que){1,a2,b2,1,QueIndex};
    77         }
    78     }
    79     CDQ(1,Index);
    80     for (int i=1; i<=QueIndex; ++i) printf("%d
    ",ans[i]);
    81     return 0;
    82 }
  • 相关阅读:
    Beyond Compare 4 过期操作
    python2 批量转 python3
    【JavaScript】为什么javascript是单线程
    Java之花样玩枚举
    OpenSSL
    OpenSSL和OpenSSH以及私有CA的实现
    Python-线程同步
    Zookeeper基础
    pycharm中使用git以及多分支结构
    BZOJ 4771 主席树+倍增+set
  • 原文地址:https://www.cnblogs.com/mjtcn/p/9230442.html
Copyright © 2011-2022 走看看