[HNOI2012] 永无乡 题解
题意:
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] 永无乡 题解的更多相关文章
- P3224 [HNOI2012]永无乡 题解
P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n.两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号. 思路 维护集合之间关 ...
- 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2733: [HNOI2012]永无乡 离线+主席树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1167 Solved: 607[Submit][Status ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- bzoj2733: [HNOI2012]永无乡 启发式合并
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec ...
- [HNOI2012]永无乡 线段树合并
[HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...
随机推荐
- B. Code For 1 一个类似于线段树的东西
http://codeforces.com/contest/768/problem/B 我的做法是,观察到,只有是x % 2的情况下,才有可能出现0 其他的,都是1来的,所以开始的ans应该是R - ...
- 使用 Realm 和 Swift 创建 ToDo 应用
原文出处: HOSSAM GHAREEB 译文出处:Prayer’s blog(@EclipsePrayer) 智能手机的快速发展的同时,涌现出了很多对开发者友好的开发工具,这些工具不仅使得开发变 ...
- 深入理解spark streaming
spark streaming是建立在spark core之上的,也就说spark streaming任务最终执行还是依赖于RDD模型.在转化成最终的RDD模型执行前,spark streaming主 ...
- Windows API函数大全二
4. API之打印函数 AbortDoc 取消一份文档的打印 AbortPrinter 删除与一台打印机关联在一起的缓冲文件 AddForm 为打印机的表单列表添加一个新表单 AddJob 用于获取一 ...
- LN : leetcode 486 Predict the Winner
lc 486 Predict the Winner 486 Predict the Winner Given an array of scores that are non-negative inte ...
- [ SNOI 2013 ] Quare
Description 题目链接 求一张无向带权图的边双连通生成子图的最小代价. Solution 核心的思路是,一个点双连通分量肯定是一堆环的并. 考虑增量地构造这个边双连通图,每次把一个环并进去, ...
- poj1190 生日蛋糕
题意: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > ...
- http与WebSocket
利用websocket连接服务器的最大特点就是:持久链接的特点. 共同点是:都是基于TCP协议进行client-server的链接,websocket是HTML5提出的一套补缺HTTP链接中不能持久链 ...
- 洛谷 P1351 联合权值
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 实用工具特别推荐 BGInfo
https://docs.microsoft.com/en-us/sysinternals/downloads/bginfo 介绍 您在办公室中走过多少次,需要点击几个诊断窗口,提醒自己其配置的重要方 ...