bzoj3685

权值线段树。。。。各种脑残错误

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<ctime>
  5 #include<cstdlib>
  6 #include<iostream>
  7 #include<algorithm>
  8 #define l(a) ((a)<<1)
  9 #define r(a) (((a)<<1)+1)
 10 #define clr(a,x) memset(a,x,sizeof(a))
 11 #define rep(i,l,r) for(int i=l;i<r;i++)
 12 typedef long long ll;
 13 using namespace std;
 14 int read()
 15 {
 16     char c=getchar();
 17     int ans=0,f=1;
 18     while(!isdigit(c)){
 19         if(c=='-') f=-1;
 20         c=getchar();
 21     }
 22     while(isdigit(c)){
 23         ans=ans*10+c-'0';
 24         c=getchar();
 25     }
 26     return ans*f;
 27 }
 28 const int maxn=1000005,inf=0x3fffffff;
 29 struct node{
 30     int l,r,mx,mn;
 31     bool v;
 32 };
 33 node x[maxn<<2];
 34 int f[maxn];
 35 void maintain(int a)
 36 {    
 37     x[a].v=x[l(a)].v|x[r(a)].v;
 38     x[a].mx=max(x[l(a)].mx,x[r(a)].mx);
 39     x[a].mn=min(x[l(a)].mn,x[r(a)].mn);
 40 }
 41 void update(int a)
 42 {
 43     maintain(a);
 44     if(a!=1) update(a>>1);
 45 }
 46 void build(int a,int l,int r)
 47 {
 48     x[a].l=l,x[a].r=r,x[a].v=0,x[a].mx=0,x[a].mn=inf;
 49     if(l==r){
 50         f[l]=a;
 51         return;
 52     }
 53     int mid=(l+r)>>1;
 54     build(l(a),l,mid);
 55     build(r(a),mid+1,r);
 56 }
 57 int find(int k)
 58 {
 59     if(x[f[k]].v) return 1;
 60     return -1;
 61 }
 62 void insert(int k)
 63 {
 64     if(find(k)==-1){
 65         x[f[k]].v=1;
 66         x[f[k]].mx=x[f[k]].mn=k;
 67         update(f[k]>>1);
 68     }    
 69 }
 70 void del(int k)
 71 {
 72     if(find(k)==1){
 73         x[f[k]].v=0;
 74         x[f[k]].mx=0;
 75         x[f[k]].mn=inf;
 76         update(f[k]>>1);
 77     }
 78 }
 79 int pre(int a,int k)
 80 {    
 81     if(!x[a].v) return 0;
 82     if(x[a].l==x[a].r) return (x[a].l<k)?x[a].l:0;
 83     int mid=(x[a].l+x[a].r)>>1;
 84     if(mid>=k) return pre(l(a),k);     
 85     int ans=pre(r(a),k);
 86     return (!ans)?pre(l(a),k):ans; 
 87 }
 88 int suc(int a,int k)
 89 {    
 90     if(!x[a].v) return 0;
 91     if(x[a].l==x[a].r) return (x[a].l>k)?x[a].l:0;
 92     int mid=(x[a].l+x[a].r)>>1;
 93     if(k>=mid) return suc(r(a),k);     
 94     int ans=suc(l(a),k);
 95     return (!ans)?suc(r(a),k):ans; 
 96 }
 97 int main()
 98 {    
 99     int n=read(),m=read();
100     build(1,1,n+1);
101     while(m--){
102         int opt=read(),t;
103         switch(opt){
104             case 1:t=read();insert(++t);break;
105             case 2:t=read();del(++t);break;
106             case 3:printf("%d\n",(x[1].mn==inf)?-1:(x[1].mn-1));break;
107             case 4:printf("%d\n",x[1].mx-1);break;
108             case 5:t=read();printf("%d\n",pre(1,++t)-1);break;
109             case 6:t=read();printf("%d\n",suc(1,++t)-1);break;
110             case 7:t=read();printf("%d\n",find(++t));break;
111         }
112     }
113     return 0;
114 }
View Code

3685: 普通van Emde Boas树

Time Limit: 9 Sec  Memory Limit: 128 MB
Submit: 619  Solved: 217
[Submit][Status][Discuss]

Description

设计数据结构支持:
1 x  若x不存在,插入x
2 x  若x存在,删除x
3    输出当前最小值,若不存在输出-1
4    输出当前最大值,若不存在输出-1
5 x  输出x的前驱,若不存在输出-1
6 x  输出x的后继,若不存在输出-1
7 x  若x存在,输出1,否则输出-1

Input

第一行给出n,m 表示出现数的范围和操作个数
接下来m行给出操作
n<=10^6,m<=2*10^6,0<=x<n

 

Output

 

Sample Input

10 11
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2


Sample Output

1
-1
2
2
2
-1

HINT

 

Source

[Submit][Status][Discuss]
posted @ 2015-07-22 18:58  ChenThree  阅读(168)  评论(0编辑  收藏  举报