[HNOI2012]永无乡

每个联通块的点集用动态开点线段树维护

并查集维护图

合并时把线段树也合并就好了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#define re register
#define gc getchar
using namespace std;
void chread(char &x){
char c=gc();
while(!isupper(c)) c=gc();
x=c;
}
void read(int &x){
char c=gc();x=; bool f=;
while(!isdigit(c)) f=(f&&c!='-'),c=gc();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=gc();
x=f?x:-x;
}
void swap(int &a,int &b){a^=b;b^=a;a^=b;}
#define N 100002
#define M 600002
struct edge{int u,v;bool del;}b[M];
struct node{
int sum,lc,rc;
}c[M<<];
int n,m,t,u,val[N],fa[N],rt[N],ttp,id[N];
double ans; void update(int &o,int l,int r,int v,int k){//插入
if(!o) o=++u;
if(l==r) {c[o].sum+=k; return;}
int mid=l+((r-l)>>);
if(v<=mid) update(c[o].lc,l,mid,v,k);
else update(c[o].rc,mid+,r,v,k);
c[o].sum=c[c[o].lc].sum+c[c[o].rc].sum;
}
void merge(int &o,int pr){//合并
if(!o||!pr) {o+=pr;return;}
c[o].sum+=c[pr].sum;
merge(c[o].lc,c[pr].lc);
merge(c[o].rc,c[pr].rc);
}
int query(int o,int l,int r,int k){//询问
if(l==r) return l;
int mid=l+((r-l)>>);
if(k<=c[c[o].lc].sum) return query(c[o].lc,l,mid,k);
else return query(c[o].rc,mid+,r,k-c[c[o].lc].sum);
}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void uni(int x,int y){//并查集合并
int r1=find(x),r2=find(y);
if(r1!=r2){
merge(rt[r1],rt[r2]);
fa[r2]=r1;
}
}
int ask(int x,int k){
int ffa=find(x);
return k>c[rt[ffa]].sum ?-:id[query(rt[ffa],,n,k)];
}
int main(){
char opt; int q1,q2;
read(n); read(m);
for(re int i=;i<=n;++i){
read(val[i]),id[val[i]]=i,fa[i]=i;
update(rt[i],,n,val[i],);
}
for(re int i=;i<=m;++i) read(q1),read(q2),uni(q1,q2);
read(t);
for(re int i=;i<=t;++i){
chread(opt); read(q1); read(q2);
switch(opt){
case 'B':{uni(q1,q2); break;}
case 'Q':{printf("%d\n",ask(q1,q2)); break;}
}
}
return ;
}

bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)的更多相关文章

  1. BZOJ2733 [HNOI2012]永无乡(并查集+线段树合并)

    题目大意: 在$n$个带权点上维护两个操作: 1)在点$u,v$间连一条边: 2)询问点$u$所在联通块中权值第$k$小的点的编号,若该联通块中的点的数目小于$k$,则输出$-1$: 传送门 上周的模 ...

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

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

  3. bzoj 2733 永无乡 - 并查集 - 线段树

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  4. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

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

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

  6. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

  7. 洛谷 P3224 [HNOI2012]永无乡 解题报告

    P3224 [HNOI2012]永无乡 题目描述 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 ...

  8. P3224 [HNOI2012]永无乡 题解

    P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n.两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号. 思路 维护集合之间关 ...

  9. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

随机推荐

  1. 【mysql】mysql front 提示Access violation at address 010C9CD0 in module ‘mysql-front.exe’

    1 错误描述: 利用mysql-front 工具新建数据库.提示了一下错误 2 解决办法: 内存越界问题,最好重新注册下Windows的动态链接库 首先“开始”—“cmd” 在打开的dos窗口中运行

  2. LeetCode - Nth Highest Salary

    题目大概意思是要求找出第n高的Salary,直接写一个Function.作为一个SQL新手我学到了1.SQL中Function的写法和变量的定义,取值.2.limit查询分    页的方法. 在这个题 ...

  3. chrom调试

    2.Event Listeners 可以看到事件找到对应在标签点开里有useCapture, passive: once: handler等等右键handler 的"show functio ...

  4. 高中生的IT之路-1.3那一幕

    上一篇讲到,当时我认为自己的命运就是小时候上学,长大后外出打工,所以高中毕业后就来到了天津,到爸爸的店铺打工. 我爸的店铺就在天津大学校园里,幸运的是,我人生的转折点也就在此. 刚到店里那段时间,每天 ...

  5. linux显示文件列表命令ls,使用ls --help列出所有命令参数

    ls命令的相关参数 在提示符下输入ls --help ,屏幕会显示该命令的使用格式及参数信息: 先介绍一下ls命令的主要参数: -a 列出目录下的所有文件,包括以 . 开头的隐含文件. -A 显示除 ...

  6. android选择图片或拍照图片上传到服务器(包括上传参数)

    From:http://blog.csdn.net/springsky_/article/details/8213898具体上传代码: 1.选择图片和上传界面,包括上传完成和异常的回调监听 [java ...

  7. Floyd算法并输出路径

    hdu1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  8. javase---Java反射操作

    1首先认识什么叫反射 正常的情况下,我们操作一个对象,则必须找到这个对象对应的类,然后实例化,然后再做各种操作, 反射的则通过一个对象获取对应的类,然后实例化,然后做各种操作, 2反射的操作步骤 I获 ...

  9. 模拟百度云盘版的ftp

    思路:一.分两个大的文件夹,一个是客户端,一个服务端的 二.实现的功能 1.    登陆--对用户名的合法性进行检测(实验账户:alex,123)                注册--设置账户,其中 ...

  10. SpringCloud 进阶之分布式配置中心(SpringCloud Config)

    1. SpringCloud Config SpringCLoud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用 的所有环境提供了一个中心化的外部配置; ...