【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线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...
随机推荐
- 写给iOS小白的MVVM教程(一): 从MVC到MVVM之一个典型的MVC应用场景
前言 本着实践为主的原则,此系列文章不做过多的概念性的阐述和讨论;更多的代码和篇幅用来展示MVC和MVVC下的基础代码结构与具体实现,来展示各自优劣.这篇文章,更多的在于发掘MVC与MVVC的共性,以 ...
- 在线代码编辑器 Codemirror 的轻量级 React 组件
代码编辑器 CodeMirror 的轻量级 React 组件 demo @uiw-react.github.io/react-codemirror/ 特性:
- 可复用 React 的 HOC 以及的 Render Props
重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品(领导)打脸,真的最后一次改需求,我们烦恼于频繁修改的需求 虽然我们不能改变别人,但我们却可以尝试去做的更好,我们需要抽象,封装 ...
- 【复杂度分析】loj#6043. 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
感觉有点假 题目大意 数据范围:$n<=100$ 题目分析 由于题目给出的是 置换,所以相当于只需枚举每个环的两个状态. 主要是复杂度分析这里: 一元环:不存在 二元环:特判保平安 三元环:不存 ...
- 连接mysql 报错 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
网上找不到 朋友说是因为非正常关机导致,mysql.server start 运行报错 ERROR! The server quit without updating PID file(): 解决办 ...
- python--pexpect
大家好,最近工作比较忙,所以没时间来更新博客.趁着还没在下个版本来临之前,来这边再更新更新.是之前学习到的一些老知识点,就当来巩固一下了.开心QAQ 今天给大家介绍的是--Pexpect Expect ...
- 霍夫圆检测 opencv
进行霍夫圆变换中有一个API:HoughCircles(). 第五个参数为double类型的minDist(),为霍夫变换检测到的圆的圆心之间的最小距离,即让算法能明显区分的两个不同圆之间的最小距离. ...
- sql查询平均下单时间
SQL查询订单平均审核时长 今天在写一个sql,需求是算一个订单在执行状态中的各个节点的时长 比如在订单中,状态0为开始接单,状态3为已经审核,那么现在需要计算每个客服的平均审核时长 像图中所示:这个 ...
- 笔记-docker-3 使用
笔记-docker-3 使用 1. 镜像 image是docker最重要的概念,docker运行容器前需要本地存在对应的镜像,如果没有,会尝试从默认镜像库下载. 1.1. 镜像获取 查 ...
- talent-aio源码阅读小记(二)
我们上一篇提到了talent-aio的四类Task:DecodeRunnable.HandlerRunnable.SendRunnable.CloseRunnable,并且分析了这些task的基类Ab ...