题意:

  n个点,有加边操作,询问与某一点处于相同的联通块的点中权值第k大的点

思路:

  对所有点建立一棵权值线段树,加边就配合并查集进行线段树合并

反思:

  动态开点,权值线段树要用sum[g[x=find(x)]](还是不够熟练),g为根。

代码:

 #include<cstdio>
const int M=,N=;
int sz,a[M],p[M],g[M],id[M],lc[N],rc[N],sum[N];
char c[]; int read()
{
int x=; char ch=getchar();
while (ch< || ch>) ch=getchar();
while (ch> && ch<) x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} int find(int x) { for (;x^p[x];x=p[x]=p[p[x]]); return x; } void add(int l,int r,int &k,int x)
{
if (!k) k=++sz; ++sum[k];
if (l==r) return;
int mid=l+r>>;
if (x>mid) add(mid+,r,rc[k],x);
else add(l,mid,lc[k],x);
} int merge(int x,int y)
{
if (!x || !y) return x|y;
lc[x]=merge(lc[x],lc[y]),rc[x]=merge(rc[x],rc[y]);
sum[x]=sum[lc[x]]+sum[rc[x]];
return x;
} int ask(int l,int r,int cur,int k)
{
if (l==r) return l;
int mid=l+r>>;
if (sum[lc[cur]]<k) return ask(mid+,r,rc[cur],k-sum[lc[cur]]);
else return ask(l,mid,lc[cur],k);
} int main()
{
int n=read(),m=read(),i,x,y;
for (i=;i<=n;++i) id[a[i]=read()]=i,p[i]=i;
for (i=;i<=m;++i) p[find(read())]=find(read());
for (i=;i<=n;++i) add(,n,g[find(i)],a[i]);
for (m=read();m--;)
if (scanf("%s",c),x=read(),y=read(),c[]=='Q')
if (sum[g[x=find(x)]]<y) puts("-1");
else printf("%d\n",id[ask(,n,g[x],y)]);
else
if ((x=find(x))^(y=find(y)))
if (sum[y]<sum[x]) p[y]=x,g[x]=merge(g[x],g[y]);
else p[x]=y,g[y]=merge(g[y],g[x]);
return ;
}

[HNOI2012] 永无乡 题解的更多相关文章

  1. P3224 [HNOI2012]永无乡 题解

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

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

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

  3. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  4. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  5. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  6. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

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

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

  8. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  9. [HNOI2012]永无乡 线段树合并

    [HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...

随机推荐

  1. MySQL系列:隐式类型转化可能带来的坑

    在开发规范中,我们往往会要求研发避免在where条件中出现隐式类型转换,这么要求大概有以下两方面的原因: 隐式类型转换可能导致索引失效: 隐式类型转换可能产生非预期的结果. 注:这里说的是隐式类型转换 ...

  2. 【转】Java集合:HashMap源码剖析

    Java集合:HashMap源码剖析   一.HashMap概述二.HashMap的数据结构三.HashMap源码分析     1.关键属性     2.构造方法     3.存储数据     4.调 ...

  3. Android开发实现高德地图定位

    1.获取Key 参考官方文档:http://lbs.amap.com/api/android-location-sdk/guide/create-project/get-key 对于签名文件的获取建议 ...

  4. Linux系统结构与终端控制台

    Linux系统结构与终端控制台 作者:Vashon 时间:20150418 以下主要是对Linux系统终端控制台切换及基本操作的范例,其他的理论就不多说了,直接进入实践部分. Starting.... ...

  5. upload 上传按钮组件 iview

    <!-- * @description 导入Excel * @fileName importExcel.vue * @author 彭成刚 * @date // :: * @version V1 ...

  6. centos7 搭建jenkins

    centos7 搭建jenkins.note 环境:VMware 虚拟机 centos 7+ jdk 1.8+ tomcat7+jenkins搭建好linux 服务器后,关闭防火墙 停止firewal ...

  7. Fiddler设置显式IP地址

    打开Fiddler, 菜单栏:Rules->Customize Rules… 或快捷键 Ctrl+R . 通过快捷键 Ctrl+F ,搜索:static function Main() 函数. ...

  8. FWT板子

    板子: #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> u ...

  9. 1.INFORMATION_SCHEMA简介

    1. INFORMATION_SCHEMA简介 INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限. INFORMAT ...

  10. 每日命令:(14)tune2fs

    tune2fs简介 tune2fs是调整和查看ext2/ext3文件系统的文件系统参数,Windows下面如果出现意外断电死机情况,下次开机一般都会出现系统自检.Linux系统下面也有文件系统自检,而 ...