HNOI2012永无乡
fhq treap+启发式合并,将小的合并到大的上面,复杂度NlogN。
最好的一点是通过dfs将一个子树内的元素转到另一个元素上。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,f[N],a[N],ma[N];
struct node
{
int l,r,s,rnd,v;
}t[N];
int get(int x){return f[x]==x?x:f[x]=get(f[x]);}
void update(int x){t[x].s=t[t[x].l].s+t[t[x].r].s+;}
void split(int now,int k,int &x,int &y)
{
if(!now)x=y=;
else
{
if(t[now].v<=k)x=now,split(t[now].r,k,t[x].r,y);
else y=now,split(t[now].l,k,x,t[y].l);
update(now);
}
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(t[x].rnd>t[y].rnd){t[x].r=merge(t[x].r,y);update(x);return x;}
else{t[y].l=merge(x,t[y].l);update(y);return y;}
}
void insert(int &rt,int x)
{
int xx,yy;
split(rt,a[x],xx,yy);
rt=merge(merge(xx,x),yy);
}
void dfs(int x,int &y)
{
if(!x)return;
dfs(t[x].l,y);dfs(t[x].r,y);
t[x].l=t[x].r=;
insert(y,x);
}
int hebing(int x,int y)
{
if(t[x].s>t[y].s)swap(x,y);
dfs(x,y);
return y;
}
int getrank(int now,int k)
{
if(t[t[now].l].s+==k)return now;
if(t[t[now].l].s+<k)return getrank(t[now].r,k-t[t[now].l].s-);
else return getrank(t[now].l,k);
}
char s[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
for(int i=;i<=n;++i)
{
f[i]=i;t[i].rnd=rand();t[i].s=;t[i].v=a[i];
}
int x,y;
for(int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
int fx=get(x);int fy=get(y);
if(fx==fy)continue;
int z=hebing(fx,fy);
f[fx]=f[fy]=f[z]=z;
}
scanf("%d",&m); for(int i=;i<=m;++i)
{
scanf("%s",s);
if(s[]=='B')
{
scanf("%d%d",&x,&y);
int fx=get(x);int fy=get(y);
if(fx==fy)continue;
int z=hebing(fx,fy);
f[fx]=f[fy]=f[z]=z;
}
else
{
scanf("%d%d",&x,&y);
if(t[get(x)].s<y){
puts("-1");continue;
}
printf("%d\n",getrank(get(x),y));
}
}
return ;
}
HNOI2012永无乡的更多相关文章
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2733: [HNOI2012]永无乡 离线+主席树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1167 Solved: 607[Submit][Status ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...
- bzoj2733: [HNOI2012]永无乡 启发式合并
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec ...
- [HNOI2012]永无乡 线段树合并
[HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...
- bzoj 2733: [HNOI2012]永无乡 -- 线段树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...
随机推荐
- 【bzoj】2326 [HNOI2011]数学作业
[题意]给定n和m,求1~n从高位到低位连接%m的结果.n=11时,ans=1234567891011%m.n<=10^18,m<=10^9. [算法]递推+矩阵快速幂 [题解] 考虑枚举 ...
- marquee滚动效果
转载两篇文章: http://blog.sina.com.cn/s/blog_49ce67fc0100atb4.html https://baike.1688.com/doc/view-d359560 ...
- 从ZoomEye API 到 Weblogic 弱口令扫描
参考资料: ZoomEye API: https://www.zoomeye.org/api/doc Weblogic-Weakpassword-Scnner: https://github.com/ ...
- 如何写出优雅的js以及js特殊技巧
由于代码和解释都写在了github的readme内部,这里就直接附上github:https://github.com/jiangzhenfei/pretty-js/tree/master
- linux的主题与图标
我先在使用arch跟xfce, 速度没得说,偶尔用一下openbox 有一天将xfce的声音给搞没了,完全不知道哪里配置错了,只好将用户文件夹下的所有配置删除,然后重启进入一切又ok啦 说一下主题,小 ...
- MySQL join 用法
select column1, column2 from TABLE1 join TABLE2 on 条件 # select * from table1 join table2; #两个表合成一个se ...
- i8042 键盘控制器-------详细介绍
[转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】
转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main. ...
- Python 根据地址获取经纬度及求距离
方法一: 使用Geopy包 : https://github.com/geopy/geopy (仅能精确到城镇,具体街道无结果返回) from geopy.geocoders import Nom ...
- Mysql授权允许远程访问
MySQL Community Edition(GPL) 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户是没有远程访问的权 ...