【权值分块】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\n",Min());
62         else if(op==4) printf("%d\n",Max());
63         else if(op==5) printf("%d\n",Pre(a));
64         else if(op==6) printf("%d\n",Next(a));
65         else printf("%d\n",b[a] ? 1 : -1);
66       }
67     return 0;
68 }

转载于:https://www.cnblogs.com/autsky-jadek/p/4097640.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值