原文地址: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;
}

最新文章

  1. git 管理
  2. 基于Angularjs实现分页
  3. cookie入门与学习
  4. 6步图文教你优化myeclipse2014
  5. javascript背景淡入淡出
  6. ISNULL
  7. FireFox浏览器的下载和安装、借助RamDisk让你的FireFox飞起来
  8. ARCGIS二维三维放大缩小
  9. 一、mysql分表简单介绍
  10. visual studio 2010配置驱动开发环境
  11. 用Visual Studio2017写静态库
  12. docker容器多服务(不推荐)
  13. Python+Selenium框架设计之框架内封装基类和实现POM
  14. ODAC(V9.5.15) 学习笔记(七)TOraUpdateSQL
  15. PostgreSQL (简称gp)小集
  16. HDU3622(二分+2-SAT)
  17. 普通程序员看k8s的账户管理
  18. FreeSWITCH收到重复的DTMF信号
  19. 关于C#中的日期的一个简单总结
  20. (转)Linux 定时关机、休眠命令

热门文章

  1. JS基础——JavaScript原型和原型链及实际应用
  2. SpringMVC-实现PUT请求上传文件(转)
  3. matlab2018a安装后帮助文档打不开解决方法
  4. macOs 使用Homebrew升级到MySQL 8系列之后,php无法连接解决方法
  5. lnamp高性能架构之apache和nginx的整合
  6. 实用jquery插件
  7. 11-Json文件配置
  8. Linux之rsync同步工具介绍+inotify同步
  9. Android 内嵌 HTML5 并进行交互
  10. 静态html引入js添加随机数后缀防止缓存