BZOJ3685普通van Emde Boas树
来源:互联网 发布:2017中小企业倒闭数据 编辑:程序博客网 时间:2024/05/04 16:54
3685: 普通van Emde Boas树
Time Limit: 9 Sec Memory Limit: 128 MB
Submit: 962 Solved: 319
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
#include<cstdio>#include<iostream>using namespace std;int n,m;struct kx{ int value;}node[4000001];int read(){ int w=0,c=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') c=-1; ch=getchar(); } while (ch>='0' && ch<='9') w=w*10+ch-'0',ch=getchar(); return w*c;}void build(int s,int l,int r){ if (l==r) return; build(s*2,l,(l+r)/2),build(s*2+1,(l+r)/2+1,r);}int find(int s,int l,int r,int val){ int mid=(l+r)/2; if (l==r) if (node[s].value) return 1; else return -1; if (val<=mid) return find(s*2,l,mid,val); else return find(s*2+1,mid+1,r,val);}void change(int s,int l,int r,int val){ int mid=(l+r)/2; if (l==r) { node[s].value=1; return; } if (val<=mid) change(s*2,l,mid,val); else change(s*2+1,mid+1,r,val); node[s].value=node[s*2].value+node[s*2+1].value;}void del(int s,int l,int r,int val){ int mid=(l+r)/2; if (l==r) { node[s].value=0; return; } if (val<=mid) del(s*2,l,mid,val); else del(s*2+1,mid+1,r,val); node[s].value=node[s*2].value+node[s*2+1].value;}int querymin(int s,int l,int r){ int mid=(l+r)/2; if (!node[s].value) return -1; if (l==r) return l; if (node[s*2].value) return querymin(s*2,l,mid); else return querymin(s*2+1,mid+1,r);}int querymax(int s,int l,int r){ int mid=(l+r)/2; if (!node[s].value) return -1; if (l==r) return l; if (node[s*2+1].value) return querymax(s*2+1,mid+1,r); else return querymax(s*2,l,mid);}int querypred(int s,int l,int r,int val){ int mid=(l+r)/2,t; if (val<0 || !node[s].value) return -1; if (l==r) return l; if (val<=mid) return querypred(s*2,l,mid,val); else { t=querypred(s*2+1,mid+1,r,val); if (t==-1) return querymax(s*2,l,mid); else return t; }}int querysucc(int s,int l,int r,int val){ int mid=(l+r)/2,t; if (!node[s].value) return -1; if (l==r) return l; if (val>mid) return querysucc(s*2+1,mid+1,r,val); else { t=querysucc(s*2,l,mid,val); if (t==-1) return querymin(s*2+1,mid+1,r); else return t; }}int main(){ int i,x,p; n=read(),m=read(); build(1,0,n); for (i=1;i<=m;i++) { p=read(); if (p!=3 && p!=4) x=read(); switch (p) { case 1:if (find(1,0,n,x)==-1) change(1,0,n,x); break; case 2:if (find(1,0,n,x)==1) del(1,0,n,x); break; case 3:printf("%d\n",querymin(1,0,n)); break; case 4:printf("%d\n",querymax(1,0,n)); break; case 5:printf("%d\n",querypred(1,0,n,x-1)); break; case 6:printf("%d\n",querysucc(1,0,n,x+1)); break; case 7:printf("%d\n",find(1,0,n,x)); break; } } return 0;}
0 0
- BZOJ3685 普通van Emde Boas树
- [BZOJ3685]普通van Emde Boas树
- BZOJ3685: 普通van Emde Boas树
- BZOJ3685普通van Emde Boas树
- BZOJ3685 普通van Emde Boas树
- bzoj3685: 普通van Emde Boas树
- 【bzoj3685】【普通van Emde Boas树】【线段树】
- bzoj3685题解(普通van Emde Boas树)
- BZOJ3685 普通 van Emde Boas 树 题解(vEB 树模板题)
- BZOJ 3685 普通van Emde Boas树
- BZOJ 3685 普通van Emde Boas树
- van Emde Boas树
- 【BZOJ】【P3685】【普通van Emde Boas树】【题解】【vEB树】
- BZOJ 3685 普通van Emde Boas树 ZKW线段树
- BZOJ 3685 普通van Emde Boas树 zkw线段树
- BZOJ 3685 普通van Emde Boas树 zkw线段树
- 【BZOJ 3685】普通van Emde Boas树【treap】
- bzoj 3685 普通van Emde Boas树(坑)
- Android开发:XML简介&DOM、PULL、SAX解析对比
- 根据要素创建要素类
- Systemd 入门教程:命令篇
- 大端模式与小端模式
- Systemd 入门教程:实战篇
- BZOJ3685普通van Emde Boas树
- Android中的Loader机制
- 计算机密码的一些技巧
- 用 express 来搭建我们的博客
- C++精进篇(一)之―数据类型
- 工作中常用的几种sql优化技巧
- hdoj 过山车 2063 (二分图最大匹配)
- 平衡二叉树的基本操作
- Android倒数计时器CountDownTimer