[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 ...
随机推荐
- springMVC3
复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以 ...
- 关于springboot 打包问题 jar包和 war包
起因:项目开发完成 需要打包部署了 发现自己不会打包 那么开始网上学习打包? 那么怎么来打包那? 我们以前没有采用springboot 时候我们都是直接将项目打成war包形式 然后放到tomc ...
- ORB-SLAM(五)KeyFrame类
KeyFrame类利用Frame类来构造.对于什么样的Frame可以认为是关键帧以及何时需要加入关键帧,是实现在tracking模块中的. 由于KeyFrame中一部分数据会被多个线程访问修改,因此需 ...
- ubuntu 关闭触控板
第一种: 1 sudo rmmod psmouse 这个是禁用的 2 sudo modprobe psmouse 这个是启用的 这个方法很便捷,但是会将触点和触板都禁用了,一般还是希望保持触点是 ...
- mysqli函数库的使用
综述 1.什么是mysqli PHP-MySQL 函数库是 PHP 操作 MySQL 资料库最原始的扩展库,PHP-MySQLi 的 i 代表 Improvement ,相当于前者的增强版,也包含了相 ...
- 西门子S7-200 SMART在win10环境下,使用虚拟机进行网络通信问题一二
原来的笔记本光荣退休,新买了小米笔记本17150.有个项目需要使用西门子S7-200 SMART,结果碰到了很多悲催的事情,新系统下的各种问题. 先贴下计算机配置,如下: 阶段一:安装问题 (1)在w ...
- HDU 3698 Let the light guide us(DP+线段树)(2010 Asia Fuzhou Regional Contest)
Description Plain of despair was once an ancient battlefield where those brave spirits had rested in ...
- NO9——线段相关
#include <stdio.h> #include <iostream> #include <math.h> #include <algorithm> ...
- 转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5 Posted February 18, 2011 at 6:29 PM ...
- java文件的I/O
[原创] java文件的I/O操作,简单来说就是向文件中写入数据以及从文件中读出数据,这是我们平日做的最多的操作,这里给出两种文件I/O操作,当然还有许多的操作方法,各种流的使用,可谓是高深莫测:不管 ...