题目链接: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. Java学习笔记三:Java的变量、常量、变量的类型及使用规则

    Java的变量.常量.变量的类型及使用规则 每一种语言都有一些具有特殊用途的词,Java也不例外,它们被称为关键字.关键字对 Java 的编译器有着特殊的意义. 一:Java中的关键字: 注:Java ...

  2. AES128加密-S盒和逆S盒构造推导及代码实现

    文档引用了<密码编码学与网络安全--原理和实践>里边的推导过程,如有不妥,请与我联系修改. 文档<FIPS 197>高级加密标准AES,里边有个S盒构造,涉及到了数论和有限域的 ...

  3. javascript实现浏览器管理员工具鼠标获取Html元素 并生成 xpath

    javascript实现浏览器管理员工具鼠标获取Html元素 并生成 xpath 看看标题就被吓尿了,够长吧.让我们看看到底是个什么玩意.. 直接上图: 就是这个东东了,做为一个写爬虫的,有必要了解下 ...

  4. VS中的快捷键

    1.代码中追踪函数的详细代码:   F12

  5. 北京Uber优步司机奖励政策(3月25日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. C++11中std::forward的使用

    std::forward argument: Returns an rvalue reference to arg if arg is not an lvalue reference; If arg ...

  7. 大数据de 2文章

    点击可免费试用网易有数 文章来源:网易有数的搭积木原则阐述 ,经作者文雯授权发布 wo ceceshi 相关文章:[推荐] SpringBoot入门(五)--自定义配置

  8. [转]struct2 拦截所有没有登录的用户,强行转到登录界面AuthorizationInterceptor

    package com.sise.action;   import java.util.Map;   import com.opensymphony.xwork2.Action; import com ...

  9. Vm-Ubuntu下配置Qt开发环境

    在昨天的Ubuntu换降下,安装Qt发现编译的时候是缺少opengl的 奈何找了好多方式都无法安装opengl 今天看到另一位大神写的,才发下自己找的还是有问题 大神帖子网址:http://blog. ...

  10. jmeter如何连接数据库

    大家都知道jmeter是java编写的,java/jmeter如果想连接数据库就要通过java database connector(JDBC)去连接,首先需先下载一个驱动 (mysql-connec ...