• 【权值分块】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 }
  • 相关阅读:
    【转】《基于MFC的OpenGL编程》Part 5 Transformations Rotations, Translations and Scaling
    【转】 《基于MFC的OpenGL编程》Part 10 Texture Mapping
    【转】 《基于MFC的OpenGL编程》Part 11 Blending, Antialiasing and Fog
    win form 托盘功能的实现(引用CSDN)
    C# win form退出窗体时对话框实用
    智能DNS 笔记
    iis无法启动, 找出占用80端口的罪魁祸首
    gvim for windows的剪贴板操作
    内容交换
    Content Networking 读书笔记
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4097640.html
Copyright © 2020-2023  润新知