【bzoj3685】普通van Emde Boas树 权值zkw线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6809743.html
题目描述
设计数据结构支持:
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
输入
第一行给出n,m 表示出现数的范围和操作个数
接下来m行给出操作
n<=10^6,m<=2*10^6,0<=x<n
样例输入
10 11
1 1
1 2
1 3
7 1
7 4
2 1
3
2 3
4
5 3
6 2
样例输出
1
-1
2
2
2
-1
题解
权值zkw线段树,无耻地卡了卡Treap
首先全是Treap的基础操作
然后是正常权值线段树代码大概50行左右
非要搞一个权值zkw线段树。。。
第一次写还写得很丑。。。
不过常数上还是非常可观。
1、2、7是权值线段树基础操作,3、4可以通过贪心轻松搞定。
5、6需要先找到前驱后继的范围再进行查询。
代码太长了。。。凑合看吧。。。
#include <cstdio>
int si[4000010] , k = 1;
void update(int p , int a)
{
si[k + p] = a;
int i;
for(i = (k + p) >> 1 ; i ; i >>= 1) si[i] = si[i << 1] + si[i << 1 | 1];
}
int querymin()
{
if(!si[1]) return -1;
int i = 1;
while(i <= k)
{
if(si[i << 1]) i = i << 1;
else i = i << 1 | 1;
}
return i - k - 1;
}
int querymax()
{
if(!si[1]) return -1;
int i = 1;
while(i <= k)
{
if(si[i << 1 | 1]) i = i << 1 | 1;
else i = i << 1;
}
return i - k - 1;
}
int getpro(int x)
{
int i;
for(i = x + k ; i ^ 1 ; i >>= 1)
if(i & 1 && si[i >> 1] > si[i])
break;
if(i == 1) return -1;
i ^= 1;
while(i <= k)
{
if(si[i << 1 | 1]) i = i << 1 | 1;
else i = i << 1;
}
return i - k - 1;
}
int getsub(int x)
{
int i;
for(i = x + k ; i ^ 1 ; i >>= 1)
if(~i & 1 && si[i >> 1] > si[i])
break;
if(i == 1) return -1;
i ^= 1;
while(i <= k)
{
if(si[i << 1]) i = i << 1;
else i = i << 1 | 1;
}
return i - k - 1;
} int main()
{
int n , m , opt , x;
scanf("%d%d" , &n , &m);
while(k <= n) k <<= 1;
while(m -- )
{
scanf("%d" , &opt);
switch(opt)
{
case 1: scanf("%d" , &x); if(!si[k + x + 1]) update(x + 1 , 1); break;
case 2: scanf("%d" , &x); if(si[k + x + 1]) update(x + 1 , 0); break;
case 3: printf("%d\n" , querymin()); break;
case 4: printf("%d\n" , querymax()); break;
case 5: scanf("%d" , &x) , printf("%d\n" , getpro(x + 1)); break;
case 6: scanf("%d" , &x) , printf("%d\n" , getsub(x + 1)); break;
default: scanf("%d" , &x) , printf("%d\n" , 2 * si[k + x + 1] - 1);
}
}
return 0;
}
【bzoj3685】普通van Emde Boas树 权值zkw线段树的更多相关文章
- 【权值分块】bzoj3685 普通van Emde Boas树
权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...
- bzoj3685普通van Emde Boas树 线段树
3685: 普通van Emde Boas树 Time Limit: 9 Sec Memory Limit: 128 MBSubmit: 1932 Solved: 626[Submit][Stat ...
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)
描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...
- BZOJ3685: 普通van Emde Boas树
显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...
- luogu1377 树的序 (线段树)
题意:给你一个1~N的排列,然后让你按顺序把它们插到一个二叉搜索树里,然后问能插出同样的二叉搜索树的 字典序最小的排列是什么 本来可以直接模拟建树然后dfs一下输出结果...然而有可能会退化成链,最差 ...
- bzoj 3730: 震波 动态点分治_树链剖分_线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...
- BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)
我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...
- 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树
原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
随机推荐
- 插入数据返回自增id及插入更新二合一
原文https://blog.csdn.net/dumzp13/article/details/50984413 JDBC: con.setAutoCommit(false); String sql ...
- CocoaAsyncSocket使用
代理的.h文件 #import <Foundation/Foundation.h> #import "GCDAsyncSocket.h" typedef void(^S ...
- 提高篇(1):RMQ问题与ST表
RMQ是英文Range Minimum/Maximum Query的缩写,是询问某个区间内的最值,这里讲一种解法:ST算法 ST算法通常用在要多次(10^6级别)询问区间最值的问题中,相比于线段树,它 ...
- poj_3641_Pseudoprime numbers
Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). Th ...
- jdbc学习笔记01
回顾: day01-03,在上一篇文章文末 day04: 分组 group by 统计每个部门的平均工资: select deptno,avg(sal) from emp group by deptn ...
- 批量更新python库
import pip from subprocess import call for dist in pip.get_installed_distributions(): try: call(&quo ...
- LeetCode961 重复 N 次的元素
问题: 重复 N 次的元素 在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次. 返回重复了 N 次的那个元素. 示例 1: 输入:[1,2,3,3] 输出:3 示例 ...
- Python--基础2
class Ball: #def setname(self,name): def __init__(self,name): self.name = name def __kick(self): #__ ...
- 为什么 redis 单线程却能支撑高并发
redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理 ...
- 笨小熊 南阳acm62
笨小熊 时间限制:2000 ms | 内存限制:65535 KB 难度:2 描述 笨小熊的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项 ...