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. 【CodeForces】901 B. GCD of Polynomials

    [题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...

  2. Python :集合类型(set)

    set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置,因此不支持索引.分片等序列的操作. 一.初始化 s0 = set() d0 = {} s1 = {0} ...

  3. void指针和NULL指针

    Void指针和NULL指针 Void指针: Void指针我们称之为通用指针,就是可以指向任意类型的数据.也就是说,任何类型的指针都可以赋值给Void指针. 举例: #include<stdio. ...

  4. POJ 3233 Matrix Power Series (矩阵快速幂)

    题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...

  5. Verilog笔记.4.inout端口

    inout是一个双向端口,实现为使用三态门,第三态为高阻态‘z’. 在实际电路中高阻态意味着响应的管脚悬空.断开. 当三态门的控制信号为真时,三态门选通,作输出端口使用:控制信号为假时,三态门是高阻态 ...

  6. http://www.onvif.org/onvif/ver20/util/operationIndex.html

    http://www.onvif.org/onvif/ver20/util/operationIndex.html

  7. ubuntu新机安装工具

    ubuntu新机安装工具:1,sudo apt-get install ssh vim2, 设置root密码,以备不时之需: 执行:sudo passwd root 然后输入当前三次密码,第一次是当前 ...

  8. openjudge-NOI 2.6-2718 移动路线

    题目链接:http://noi.openjudge.cn/ch0206/2718/ 题解: 递推,某一个点只能从其左边或者下边走过来 f[i][j]存储(i,j)这个点上的结果,即f[i][j]=f[ ...

  9. 如何读懂statspack报告

    前言:这篇文章是我从网上找到的,但可惜不知道是哪位大侠写(译)的,因此这里无法注明了.仔细看了看,这篇文章对初学者应该很有帮助,写的比较详细,通俗易懂,因此整理一下,便于阅读:内容略有调整,不单做调整 ...

  10. sed的额外用法(网摘)

    #在我开始动手写一个一个的脚本的时候才会看到更多的用法 1. 在某行的前一行或后一行添加内容(前提是要确定行的内容) # 匹配行前加 sed -i '/allow/ideny' httpd.conf ...