[bzoj 2733]启发式合并权值线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2733
平衡树待学习。从一个博客学到了合并权值线段树的姿势:http://blog.csdn.net/werkeytom_ftd/article/details/51761651
#include<bits/stdc++.h>
using namespace std; const int maxn=; int read(){
int x=;
char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<=''){
x=x*+ch-'';
ch=getchar();
}
return x;
} char get(){
char ch=getchar();
while (ch!='Q'&&ch!='B') ch=getchar();
return ch;
} struct Node
{
int val,lson,rson;
}node[maxn+maxn*];
int fa[maxn];
int a[maxn];
int b[maxn];
int tot;
int n; int findfa(int u)
{
if (fa[u]==u) return u;
else return fa[u]=findfa(fa[u]);
} int rt[maxn]; void insert(int root,int k,int l,int r)
{
node[root].val++;
if (l==r) return;
int mid=(l+r)/;
if (k<=mid)
{
if (!node[root].lson) node[root].lson=++tot;
insert(node[root].lson,k,l,mid);
}
else
{
if (!node[root].rson) node[root].rson=++tot;
insert(node[root].rson,k,mid+,r);
}
} int merge(int rt1,int rt2,int l,int r)
{
if (!rt2) return rt1;
if (!rt1) return rt2;
if (l==r)
{
node[rt1].val+=node[rt2].val;
return rt1;
}
int mid=(l+r)/;
node[rt1].val+=node[rt2].val;
node[rt1].lson=merge(node[rt1].lson,node[rt2].lson,l,mid);
node[rt1].rson=merge(node[rt1].rson,node[rt2].rson,mid+,r);
return rt1;
} int query(int root,int k,int l,int r)
{
if (l==r) return l;
int mid=(l+r)/;
if (node[node[root].lson].val>=k) return query(node[root].lson,k,l,mid);
else return query(node[root].rson,k-node[node[root].lson].val,mid+,r);
} void addedge(int u,int v)
{
int f1=findfa(u);
int f2=findfa(v);
if (f1!=f2)
{
fa[f2]=f1;
rt[f1]=merge(rt[f1],rt[f2],,n);
}
} int main()
{
// freopen("in.txt","r",stdin);
int m;
n=read();
m=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++) b[a[i]]=i;
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=n;i++) rt[i]=++tot;
for (int i=;i<=n;i++) insert(rt[i],a[i],,n);
for (int i=;i<m;i++)
{
int u,v;
u=read();
v=read();
addedge(u,v);
}
int q;
q=read();
while (q--)
{
char s;
int u,v;
s=get();
u=read();
v=read();
if (s=='B') addedge(u,v);
else
{
int f=findfa(u);
if (node[f].val<v) printf("-1\n");
else printf("%d\n",b[query(rt[f],v,,n)]);
}
}
return ;
}
[bzoj 2733]启发式合并权值线段树的更多相关文章
- BZOJ 3531: [Sdoi2014]旅行 权值线段树 + 树链剖分
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...
- Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...
- bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】
bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...
- 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- 权值线段树&线段树合并
权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...
- [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并
题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...
随机推荐
- ruby OpenURI模块使用
OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP(OpenURI支持重定向) 像打开普通文件那样打开ht ...
- atlas+mysql部署mysql读写分离
1.atlas 简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基 ...
- 来自一个大三开学三周的huster的迷茫与失措
大三开学考研保研的话题开始多了起来.自从前天去听了一回谢长生教授的实验室宣讲会,回来直到现在都好像心头上压了些东西,喘不过气来.本来我就少与外界接触,加之我自己一个人主动学习的积极性也很是缺乏,所以当 ...
- 【ajax】ajax异步实现用户注册验证
从前台到后台实现简单用户注册检查用户是否存在 1.编写domain public class User { private String username; private String passwo ...
- python入门——Anaconda安装
初学Python,可以选择python原始的IDE,但原始的IDE在使用过程中需要自己安装各种包,个人觉得初学者不需要将时间花在这些上面,而是应该直接学习python程序,这些比较杂的事情可以在以后的 ...
- TCD产品技术参考资料
1.Willis环 https://en.wikipedia.org/wiki/Circle_of_Willis 2.TCD仿真软件 http://www.transcranial.com/index ...
- python2.7练习小例子(二十五)
25):题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他 ...
- Android Studio modify language level to Java 8
If you need use lambda, should modify language level File -> Project Structure -> app -> Pr ...
- android ActionBar 去掉menu分隔线
自定义Theme继承原来Theme修改其中的分隔线: <item name="actionBarDivider">@null</item> 低版本设置 & ...
- Union-find 并查集
解决问题 给一系列对点0~N-1的连接,判断某两个点p与q是否相连. private int[] id; // 判断p和q是否属于同一个连通分量 public boolean connected(in ...