这题也能够用树状数组做,并且树状数组姿势更加优美。代码更加少,只是这个Treap树就是求第K大元素的专家……所以速度比較快。

这个也是从那本红书上拿的模板……自己找了资料百度了好久,才理解这个Treap主要的知识,要是自己写真的得写到什么时候啊!。。

然后输入的时候是写n-k+1反着找的,就是这里又浪费了好多时间debug。唉……

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define sc(a,b) scanf("%d%d",&a,&b)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 440004
#define MN 1008
#define INF 100000007
#define eps 1e-7
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
struct Treap
{
int root,treapCnt,key[MM],priority[MM],childs[MM][2],cnt[MM],size[MM];
Treap()
{
root=0;
treapCnt=1;
priority[0]=INF;
size[0]=0;
}
void update(int x)
{
size[x]=size[childs[x][0]]+cnt[x]+size[childs[x][1]];
}
void rotate(int &x,int t)
{
int y=childs[x][t];
childs[x][t]=childs[y][1-t];
childs[y][1-t]=x;
update(x);
update(y);
x=y;
}
void _insert(int &x,int k)
{
if(x)
{
if(key[x]==k) cnt[x]++;
else
{
int t=key[x]<k;
_insert(childs[x][t],k);
if(priority[childs[x][t]]<priority[x]) rotate(x,t);
}
}
else
{
x=treapCnt++;
key[x]=k;
cnt[x]=1;
priority[x]=rand();
childs[x][0]=childs[x][1]=0;
}
update(x);
}
void _erase(int &x,int k)
{
if(key[x]==k)
{
if(cnt[x]>1) cnt[x]--;
else
{
if(childs[x][0]==0&&childs[x][1]==0)
{
x=0;
return ;
}
int t=priority[childs[x][0]]>priority[childs[x][1]];
rotate(x,t);
_erase(x,k);
}
}
else _erase(childs[x][key[x]<k],k);
update(x);
}
int _getkth(int &x,int k)
{
if(k<=size[childs[x][0]]) return _getkth(childs[x][0],k);
k-=size[childs[x][0]]+cnt[x];
if(k<=0) return key[x];
return _getkth(childs[x][1],k);
}
void insert(int k)
{
_insert(root,k);
}
void erase(int k)
{
_erase(root,k);
}
int getkth(int k)
{
return _getkth(root,k);
}
}treap;
int f[MM],a[MM];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
int n,m,i,k,x,y;
sc(n,m);
for(i=0;i<=n;i++) f[i]=i,a[i]=1; //初始每一个区间的元素都是1咯。自身嘛。
for(i=1;i<=n;i++) treap.insert(1);
for(i=1;i<=m;i++)
{
sca(k);
if(!k)
{
sc(x,y);
x=find(x),y=find(y);
if(x==y) continue;
f[y]=x;
treap.erase(a[x]); //先把这两个区间删除了
treap.erase(a[y]);
a[x]+=a[y]; //区间合并。元素相加
treap.insert(a[x]); //然后把合并的加到treap平衡树中
n--; //合并区间,总区间少1
}
else
{
sca(k);
pri(treap.getkth(n-k+1)); //反着找
}
}
return 0;
}

最新文章

  1. 10分钟学习pandas
  2. JavaACOFramework的各个类介绍(part3 : Ant4ACS类)
  3. AngularJS小知识点一
  4. Jsp字符编码过滤器
  5. 禁用UITextField复制粘贴等方法
  6. Object的增。删。查。改。遍历
  7. Objective-C语法简记学习
  8. ios文本框基本使用,以及所有代理方法的作用
  9. Selenium WebDriver 中鼠标和键盘事件分析及扩展[转载]
  10. 开启第一个Node.js的Express项目
  11. python 内存NoSQL数据库
  12. qt+opencv LNK4272:library machine type &#39;x64&#39; conflicts with target mathine type &#39;x86&#39;
  13. 用document.readyState实现网页加载进度条
  14. java之旅_高级教程_java泛型
  15. nginx xxx.conf
  16. Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档
  17. C#基础笔记(第二十天)
  18. UCanCode发布升级E-Form++可视化源码组件库2018全新版 !
  19. Tomcat启动时报 java.lang.OutOfMemoryError: Java heap space
  20. gitlab 阿里邮箱配置

热门文章

  1. vue 简易toDoList
  2. 事务的四大属性ACID即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.。
  3. 使用docker-maven-plugin插件构建docker镜像(已过时)
  4. [HNOI2012]矿场搭建(tarjan求点双)
  5. sql联合主键,用于多对多,关系映射
  6. 刷leetcode是什么样的体验?【转】
  7. Web安全-XSS-SQL注入-CSRF
  8. LeetCode OJ-- Populating Next Right Pointers in Each Node II **@
  9. LeetCode OJ-- 3Sum Closest
  10. Android 读取手机联系人、拨号、发送短信及长按菜单的操作