luogu3224 [HNOI2012]永无乡
线段树合并好写好调,隔壁老王的treap+启发式合并难写难调
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, fa[100005], val[100005], rot[100005], uu, vv, fan[100005], cnt;
int lson[5000005], rson[5000005], sum[5000005];
char ss[5];
int myfind(int x){
return fa[x]==x?x:fa[x]=myfind(fa[x]);
}
void insert(int &k, int l, int r, int x){
if(!k) k = ++cnt;
if(l==r) sum[k] = 1;
else{
int mid=(l+r)>>1;
if(x<=mid) insert(lson[k], l, mid, x);
if(mid<x) insert(rson[k], mid+1, r, x);
sum[k] = sum[lson[k]] + sum[rson[k]];
}
}
int query(int o, int l, int r, int x){
if(l==r) return l;
int mid=(l+r)>>1;
if(x<=sum[lson[o]]) return query(lson[o], l, mid, x);
else return query(rson[o], mid+1, r, x-sum[lson[o]]);
}
int merge(int x, int y){
if(x==0 || y==0) return x+y;
lson[x] = merge(lson[x], lson[y]);
rson[x] = merge(rson[x], rson[y]);
sum[x] = sum[lson[x]] + sum[rson[x]];
return x;
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
scanf("%d", &val[i]);
fa[i] = i;
fan[val[i]] = i;
}
for(int i=1; i<=m; i++){
scanf("%d %d", &uu, &vv);
fa[myfind(vv)] = myfind(uu);
}
for(int i=1; i<=n; i++)
insert(rot[myfind(i)], 1, n, val[i]);
cin>>m;
while(m--){
scanf("%s", ss);
if(ss[0]=='Q'){
scanf("%d %d", &uu, &vv);
int p=myfind(uu);
if(sum[rot[p]]<vv) printf("-1\n");
else printf("%d\n", fan[query(rot[p], 1, n, vv)]);
}
else{
scanf("%d %d", &uu, &vv);
int p=myfind(uu), q=myfind(vv);
if(p!=q){
fa[q] = p;
rot[p] = merge(rot[q], rot[p]);
}
}
}
return 0;
}
luogu3224 [HNOI2012]永无乡的更多相关文章
- 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来表示.某些 ...
- 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...
- bzoj2733: [HNOI2012]永无乡 启发式合并
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec ...
- [HNOI2012]永无乡 线段树合并
[HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...
随机推荐
- 从零开始的全栈工程师——js篇2.9(this详解)
this 一.this是js的一个关键字 指定一个对象然后去替代他 只研究函数内的this 分两种 函数内的this和函数外的this1)函数内的this指向行为发生的主体2)函数外的this都 ...
- Servlet高级部分Listener
监听器的使用场景: ①:统计在线人数 ②:实现单一登录[一个账号只能在一台机器上登录] Servlet中的8大监听器: 1. ServletContextListener [接口方 ...
- echarts使用中的那些事儿(一)
近来由于有几个小项目要用到echarts里的一些图,不得不使用,可是要完全按照自己的意愿来,要对它有些了解,要翻阅资料,遂有以下小结: 1.最开始第一步是把数据调出来就行,能在图上显示就成,以下是最开 ...
- UVA Stacks of Flapjacks 栈排序
题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成.给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假 ...
- Copy Failed Error Access to fobidden
使用SVN的branch/tag命令来切包时,报出了一下错误提示 就这个错误,调了整整一天,如果你也遇到了类似问题,我真心希望下面解决问题的过程能帮助到你:D 解决过程: 1.网上查了很多帖子,发现跟 ...
- iOS开发:自定义带下划线文本的UIButton
Uiunderlinedbutton.h代码 @interface UIUnderlinedButton : UIButton { } + (UIUnderlinedButton *) underli ...
- go语言,爬取百度贴吧指定贴所有内容
初级爬虫,为了学习一下常用的goquery. goquery 配置 go get https://github.com/PuerkitoBio/goquery 会提示不支持https方式 解决方案: ...
- iOS中的崩溃类型
http://blog.csdn.net/womendeaiwoming/article/details/44243571 OS中的崩溃类型 在这里了解一下XCode用来表示各种崩溃类型的术语,补充一 ...
- Hadoop完全分布式集群环境搭建
1. 在Apache官网下载Hadoop 下载地址:http://hadoop.apache.org/releases.html 选择对应版本的二进制文件进行下载 2.解压配置 以hadoop-2.6 ...
- JavaScript中的confirm的用法
confirm()方法用于显示一个带有指定消息和ok以及取消按钮的对话框confirm(message,ok,cancel); message:表示在弹出框的对话框中现实的文本信息如果用户点击确定按钮 ...