zoukankan      html  css  js  c++  java
  • 【权值分块】bzoj3685 普通van Emde Boas树

    权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快。但是被zkw线段树完虐。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 using namespace std;
     5 #define N 1000001
     6 int maxv,minv=2147483647;
     7 int n,op,a,m,ma[N],en,l[1100],r[1100],sumv[1100],sz,sum,num[N];
     8 bool b[N];
     9 void makeblock()
    10 {
    11     sz=sqrt(n); if(!sz) sz=1; r[0]=-1;
    12     for(sum=1;sum*sz<n-1;sum++)
    13       {
    14         l[sum]=r[sum-1]+1;
    15         r[sum]=sz*sum-1;
    16         for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
    17       }
    18     l[sum]=r[sum-1]+1;
    19     r[sum]=n-1;
    20     for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
    21 }
    22 inline void Insert(const int &x){if(b[x]) return; b[x]=1; sumv[num[x]]++;}
    23 inline void Delete(const int &x){if(!b[x]) return; b[x]=0; sumv[num[x]]--;}
    24 inline int Next(const int &x)
    25 {
    26     for(int i=x+1;i<=r[num[x]];i++) if(b[i]) return i;
    27     for(int i=num[x]+1;i<=sum;i++) if(sumv[i])
    28       for(int j=l[i];j<=r[i];j++)
    29         if(b[j]) return j;
    30     return -1;
    31 }
    32 inline int Pre(const int &x)
    33 {
    34     for(int i=x-1;i>=l[num[x]];i--) if(b[i]) return i;
    35     for(int i=num[x]-1;i>=1;i--) if(sumv[i])
    36       for(int j=r[i];j>=l[i];j--)
    37         if(b[j]) return j;
    38     return -1;
    39 }
    40 inline int Min()
    41 {
    42     for(int i=1;i<=sum;i++) if(sumv[i])
    43     for(int j=l[i];j<=r[i];j++) if(b[j]) return j;
    44     return -1;
    45 }
    46 inline int Max()
    47 {
    48     for(int i=sum;i>=1;i--) if(sumv[i])
    49     for(int j=r[i];j>=l[i];j--) if(b[j]) return j;
    50     return -1;
    51 }
    52 int main()
    53 {
    54     scanf("%d%d",&n,&m);
    55     makeblock();
    56     for(int i=1;i<=m;i++)
    57       {
    58         scanf("%d",&op); if(op!=3&&op!=4) scanf("%d",&a);
    59         if(op==1) Insert(a);
    60         else if(op==2) Delete(a);
    61         else if(op==3) printf("%d
    ",Min());
    62         else if(op==4) printf("%d
    ",Max());
    63         else if(op==5) printf("%d
    ",Pre(a));
    64         else if(op==6) printf("%d
    ",Next(a));
    65         else printf("%d
    ",b[a] ? 1 : -1);
    66       }
    67     return 0;
    68 }
  • 相关阅读:
    Codeforces Round #622 C2.Skyscrapers (hard version)
    蓝桥杯 54合根植物(并查集+统计集合个数)
    蓝桥杯 6翻硬币
    Codeforces Round #622 (Div. 2) C1. Skyscrapers (easy version)(简单版本暴力)
    Codeforces Round #622 (Div. 2) A. Fast Food Restaurant
    洛谷P1734 最大约数和(01背包)
    HDU 1069 Monkey and Banana(线性DP)
    2019CSP-S T1格雷码
    eclipse使用git提交项目
    GitHub 注册失败的原因 以及解决 。
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4097640.html
Copyright © 2011-2022 走看看