原文地址: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线段树的更多相关文章

  1. 【权值分块】bzoj3685 普通van Emde Boas树

    权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...

  2. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1932  Solved: 626[Submit][Stat ...

  3. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  4. 【HIHOCODER 1576】 子树中的最小权值(线段树维护DFS序)

    描述 给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多 ...

  5. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  6. luogu1377 树的序 (线段树)

    题意:给你一个1~N的排列,然后让你按顺序把它们插到一个二叉搜索树里,然后问能插出同样的二叉搜索树的 字典序最小的排列是什么 本来可以直接模拟建树然后dfs一下输出结果...然而有可能会退化成链,最差 ...

  7. bzoj 3730: 震波 动态点分治_树链剖分_线段树

    ##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...

  8. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  9. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

随机推荐

  1. Oracle 的jdbc方法

    package com.swift.jdbc_oracle; import java.sql.CallableStatement; import java.sql.Connection; import ...

  2. java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数

    package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...

  3. elasticsearch-dsl笔记

    一.elasticsearch安装 安装java1.8以上 安装elasticsearch-rtf(https://github.com/medcl/elasticsearch-rtf) head插件 ...

  4. linux下安装xtrabackup

    下载需要的版本的xtrabackup软件包,链接如下: https://www.percona.com/downloads/XtraBackup/LATEST/ percona-xtrabackup- ...

  5. django+xadmin在线教育平台(九)

    django admin介绍 上一章我们进行了需求分析和数据库设计.本章我们来快速搭建一个可用的后台管理系统. 后台管理系统特点: 权限管理 少前端样式.(样式一般不是很看重), 快速开发 djang ...

  6. C#爬虫实践

    忘了什么时候加的,iPad上的人人视频追剧了<我的天才女友>,没事的时候看了下,感觉还不错,进一步了解到原著那不勒斯四部曲,感觉视频进度有些慢,就想找找书看看,一时没找到[PS:购买实体书 ...

  7. git 代码托管使用方法

    Git代码托管 1 准备材料 在coding,github这些代码托管网站上申请一个账户. Linux平台什么需要一个git,如ubuntu 需要 $ sudo apt-get install git ...

  8. Python学习-django-Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  9. perl语言入门总结-第5章-输入输出

    读取标准输入 chomp($line = <STDIN>); #去掉后面的换行 while (defined($line = <STDIN>)) { print "I ...

  10. UCLOUD使用云主机

    购买云主机后,购买弹性ip: 设置外网防火墙,浏览器否则无法访问服务器资源: 在云主机绑定自定义的防火墙: 使用ssh登录服务器: 一般centos自带apache,没有的话安装,具体教程百度: 安装 ...