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永无乡的更多相关文章

  1. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  3. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  4. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

  5. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  6. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

  7. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  8. [HNOI2012]永无乡 线段树合并

    [HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...

  9. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

  10. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

随机推荐

  1. CSS中filter滤镜的学习笔记

    1.CSS静态滤镜样式 (filter)(只有IE4.0以上支持)  CSS静态滤镜样式的使用方法:{ filter : filtername( parameters1, parameters2, . ...

  2. marquee滚动效果

    转载两篇文章: http://blog.sina.com.cn/s/blog_49ce67fc0100atb4.html https://baike.1688.com/doc/view-d359560 ...

  3. 【leetcode 简单】第三十七题 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  4. flex布局语法(阮一峰)

    Flex 布局教程:语法篇   作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + posi ...

  5. Verilog笔记.3.有限状态机

    有限状态机有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向哪一状态还是 ...

  6. win10环境变量

    jdk8 JAVA_HOME D:\devsoft\jdk\jdk1.8 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar pa ...

  7. python 实现字符串转整型

    def str2Int(s): l=list(s) if len(l)<=0: return 0 flag=0 sum=0 dict_num={':9} dict_tag={'+':1,'-': ...

  8. 执行impdp时出现的各种问题

    1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...

  9. SQLite3 安装、基本操作

    1. 安装SQLite3 sudo apt-get install sqlite3 2. 安装Sqlite3编译需要的工具包 如果,你需要的话可以安装该工具包.只是为了体验一把,可以不安装.该项是可选 ...

  10. [ python ] 软件开发规范

    在python开发中,我们建议采用如下规范: soft/ ├── bin # 程序执行文件目录 │   ├── __init__.py │   └── start.py # 程序开始执行脚本文件 ├─ ...