[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 ...
随机推荐
- JAVA 反射之Method
★ Method没有构造器,只能通过Class获取. 重点方法: class.getDeclaredMethods():获取所有方法. class.getDeclaredMethod(String n ...
- python2.7入门---运算符 &案例
已经分享过变量类型的基本概念了,接下来就研究了一下运算符的基础知识.接下来我们就来看一下内容.举个简单的例子 4 +5 = 9 .例子中,4 和 5 被称为操作数,"+" ...
- @Transactional spring 事务(转载)
原文链接: http://www.cnblogs.com/sweetchildomine/p/6978037.html?utm_source=itdadao&utm_medium=referr ...
- Android面试收集录 Android系统的资源+其他
1.Android应用程序的资源是如何存储的,如何使用? res文件夹或者assets文件夹 res目录中的资源在R类中生成一个int变量,然后再布局文件中可以直接使用,在代码中,要getResour ...
- No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").警告解决方法
在使用BeautifulSoup库时出现该警告,虽然不影响正常运行,但强迫症不能忍啊!! 详细警告信息如下: UserWarning: No parser was explicitly specifi ...
- centos linux 因别名问题引起的麻烦及解决技巧
老男孩儿-19期 L005-13节中分享.自己整理后发到自己微博中留档. 原文:http://oldboy.blog.51cto.com/2561410/699046 实例:老男孩linux实战培训第 ...
- APK反编译后添加日志
一.反编译 参考前一篇文章 二.添加寄存器(locals) 因为要添加日志,我们一般需要用一个变量来存储TAG,所以需要增加一个寄存器 如: # virtual methods .method pub ...
- mcrouter facebook 开源的企业级memcached代理
原文地址:https://code.facebook.com/posts/296442737213493/introducing-mcrouter-a-memcached-protocol-route ...
- 接口测试工具postman(二)创建新项目
1.此次添加一个request,可以点击左上角的New的下拉选择Request,或者点击New弹出选项框点击Request 2.弹出新增request页面 3.添加请求的参数等 4.也可以直接添加新请 ...
- Oracle 11g 审计跟踪管理
在Oracle11g之前,oracle数据库自带的审计功能是关闭的,考虑到性能和审计管理的复杂性,用户一般不打开审计功能.如果有审计要求,DBA会采用trigger来实现对DDL审计的方法来折中.例如 ...