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 }

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

By Zky

[Submit][Status][Discuss]

时间: 2024-10-17 10:49:11

bzoj3685的相关文章

bzoj3685: 普通van Emde Boas树 set+读入优化

显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using namespace std; void read(int& x){ const int k=1600000; static char v, u[k],*s=u,*t=u; x=0; while(isspace(v=s==t &&u==(t=u+fread(s=u, 1,k,stdin))?-1

【bzoj3685】普通van Emde Boas树 权值zkw线段树

原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html 题目描述 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当前最大值,若不存在输出-15 x  输出x的前驱,若不存在输出-16 x  输出x的后继,若不存在输出-17 x  若x存在,输出1,否则输出-1 输入 第一行给出n,m 表示出现数的范围和操作个数接下来m行给出操作n<=10^6,m<=2*10^6,

bzoj3685 普通veb树

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 常规做法是用线段树,但根据这题的特点,还有

【权值分块】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]

bzoj3685普通van Emde Boas树 线段树

3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1932  Solved: 626[Submit][Status][Discuss] Description 设计数据结构支持:1 x  若x不存在,插入x2 x  若x存在,删除x3    输出当前最小值,若不存在输出-14    输出当前最大值,若不存在输出-15 x  输出x的前驱,若不存在输出-16 x  输出x的后继,若不存在输出-17 x  若x

[临时向]蒟蒻的填坑记录

TAT这周开始填坑....这周大概是数据结构吧?来这里记录一下免得自己过几天又开始颓了TAT 1.3:中午看了下zkw线段树,写了bzoj3685...找前驱后缀的姿势不是很科学...不过速度相差不大就懒得改了. 晚上写treap..分别用zkw线段树和treap写了bzoj3224普通平衡树.....正常的treap大概300+ms...zkw线段树190+ms 1.4:中午用treap写了1503郁闷的出纳员....晚上写1058报表统计..弄了一晚上TAT 目测明天重开spaly...

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ