题目链接: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]启发式合并权值线段树的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 权值线段树 + 树链剖分

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

  2. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

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

  3. bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】

    bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...

  4. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

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

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  6. 权值线段树&线段树合并

    权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...

  7. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

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

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

  9. 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并

    题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...

随机推荐

  1. python学习——函数

     一.在python的世界里什么是函数: 答:函数通常是用来实现某一个功能二被封装成的一个对象,是用来实现代码复用的常用方式 现在有一个需求,假如你在不知道len()方法的情况下,要你计算字符串‘he ...

  2. 怎么用Python Flask模板jinja2在网页上打印显示16进制数?

    问题:Python列表(或者字典等)数据本身是10进制,现在需要以16进制输出显示在网页上 解决: Python Flask框架中 模板jinja2的If 表达式和过滤器 假设我有一个字典index, ...

  3. 笔记-python-常见特殊变量

    笔记-python-常见特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结 ...

  4. Django学习之天气调查实例(3):部署静态文件CSS、JS、images等(部署环境基于Ubuntu)

    在设计登录界面时,采用了网上下载的登录模板,漂亮,简易.但是在测试和部署时,发现原来模板中采用的js文件和css文件,却着实让我折腾了好几天. 在以往的网页设计中,一般只要把测试站点开启后,网页中的静 ...

  5. P1346 电车(dijkstra)

    P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...

  6. LeetCode:22. Generate Parentheses(Medium)

    1. 原题链接 https://leetcode.com/problems/generate-parentheses/description/ 2. 题目要求 给出一个正整数n,请求出由n对合法的圆括 ...

  7. RAID(冗余硬盘阵列)

    一. RAID定义 RAID( Redundant Array of Independent Disk 独立冗余磁盘阵列 )技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的 ...

  8. unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色

    在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的 ...

  9. 【APUE】Chapter10 Signals

    Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...

  10. 在Linux上进行mySql安装部署及遇到的问题的解决方法

    前提: Linux centOS虚拟机64位 1.首先确认是否已安装过MySQL 方法一:删除原有的MySQL目录: 使用查找语句: whereis mysql find / -name mysql ...