题意:

n<=1e5的图里,在线连边、查询某连通块第k大

思路:

练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点、回收

听说启发式合并splay更快QAQ,学会了试试

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mp make_pair
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 1e5+;
const int maxm = 6e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int n,m;
int q;
int ls[maxn*],rs[maxn*],dat[maxn*];
int root[maxn];
int a[maxn],id[maxn]; int f[maxn];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
} int tot;
queue<int>pool;
int New(){
if(!pool.empty()){
int x = pool.front();
pool.pop();
return x;
}
++tot;
return tot;
}
void del(int x){
if(!x)return;
pool.push(x);
return;
}
int build(int l, int r, int x){
int mid = (l+r)>>;
int p = New();
dat[p]=;
if(l==r)return p;
if(x<=mid)ls[p]=build(l,mid,x);
else rs[p]=build(mid+,r,x);
return p;
}
int merge(int p, int q){// leave p
if(!p)return q;
if(!q)return p;
ls[p]=merge(ls[p],ls[q]);
rs[p]=merge(rs[p],rs[q]);
dat[p]+=dat[q];
ls[q]=rs[q]=dat[q]=;
del(q);
return p;
}
int query(int x, int l, int r, int k){
int mid = (l+r)>>;
if(l==r)return l;
if(dat[ls[x]]>=k){
return query(ls[x],l,mid,k);
}
else{
return query(rs[x],mid+,r,k-dat[ls[x]]);
}
}
int main() {
scanf("%d %d" ,&n, &m);
for(int i = ; i <= n; i++){
f[i]=i;
scanf("%d", &a[i]);
id[a[i]]=i;
root[i]=build(,n,a[i]);
}
/*for(int i = 1; i <= n; i++){
printf("-- %d root::%d\n",i,root[i]);
}
for(int i = 1; i <= tot; i++){
//printf("%d ==== %d %d %d\n",i,ls[i],rs[i],dat[i]);
}*/
for(int i = ; i <= m; i++){
int x,y;
scanf("%d %d" ,&x, &y);
int t1 = find(x);
int t2 = find(y);
if(t1!=t2){
root[t1]=merge(root[t1],root[t2]);
f[t2]=t1;
}
}
scanf("%d", &q);
while(q--){
char op[];
int x,y;
scanf("%s %d %d", op,&x,&y);
if(op[]=='Q'){
int t = find(x);
if(dat[root[t]]<y){printf("-1\n");continue;}
else printf("%d\n",id[query(root[t],,n,y)]);
}
else{
int t1 = find(x);
int t2 = find(y);
if(t1!=t2){
root[t1]=merge(root[t1],root[t2]);
f[t2]=t1;
}
}
}
return ;
}
/*
5 1
4 3 2 5 1
1 2
7
Q 3 2
Q 2 1
B 2 3
B 1 5
Q 2 1
Q 2 4
Q 2 3
*/

BZOJ 2733 [HNOI2012]永无乡 (权值线段树启发式合并+并查集)的更多相关文章

  1. BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并

    问题描述 BZOJ2733 LG3224 题解 对于每个结点建立一棵权值线段树. 查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树. 并查集维护连通性. 同时 STO hkk,zcr, ...

  2. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  3. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...

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

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

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

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

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

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

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

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

  8. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3955  Solved: 2112[Submit][Statu ...

  9. bzoj 2733: [HNOI2012]永无乡【并查集+权值线段树】

    bzoj上数组开大会T-- 本来想用set瞎搞的,想了想发现不行 总之就是并查集,每个点开一个动态开点的权值线段树,然后合并的时候把值并在根上,询问的时候找出在根的线段树里找出k小值,看看这个值属于哪 ...

随机推荐

  1. python3 三行代码基于HTTP2完美实现APNS推送【详解】

    第一次做苹果APNS(Apple Push Notification service)推送,关于APNS推送原理以及证书的获取方式网上已经有许多资料,在此不做过多赘述,需要注意的是证书分为测试证书和正 ...

  2. C#调用JS的WebService的方法返回null

    连上了别人的VPN后,使用WebService测试软件测试了一下,结果正常,但是当我在vs里面添加WebService服务,调用的时候就出现了问题,问题如下图: 后来问了一下服务端那边的同事,他们说服 ...

  3. SQL Server2012高可用之日志传送测试

    (一)日志传送架构 (1.1)相关服务器 主服务器   :用于生产的服务器,上面运行这生产SQL Server数据库: 辅助服务器:用于存放主服务器上数据库的一个“镜像”数据库: 监控服务器:用来监控 ...

  4. 数据结构与算法 Python语言实现 第一章练习

    说明:部分代码参考了Harrytsz的文章:https://blog.csdn.net/Harrytsz/article/details/86645857 巩固 R-1.1 编写一个Python函数 ...

  5. Epplus Excel 导入 MSSQL 数据库

    效果: 下载EXE     源码

  6. .net core 2.2 中IHttpClientFactory的使用

    在.net core中使用HttpClient请求api,有很多资源的问题,比如使用using的时候,虽然可以释放资源,但是套接字(socket)也不会立即释放,所以.net core2.1中,新增了 ...

  7. EasyExcel 自定义单元格式的问题。

    最近在做一个关于性能测试管理系统,一个新的需求,需要导出测试报告,直接使用了ali的封装的EasyExcel,但是在复杂头与一些样式,就缺少了自定义的灵活性,在官方demo中没有找到很好的解决方法. ...

  8. Spring-cloud微服务实战【六】:接口服务feign

    在上一篇文章中,我们使用了ribbon进行负载均衡,但是仔细思考一下,我们的请求封装和调用以及结果的返回都是我们自己编码完成的,如果需要调用的接口很多,那么无疑开发量是比较大的,那有没有比较好的方式呢 ...

  9. 用户输入- Unity3D游戏开发培训

    用户输入- Unity3D游戏开发培训   作者:Jesai 时间:2018-02-12 14:28:45 用户输入Input 鼠标按键: -方法:GetMouseButton(); -方法:GetM ...

  10. ORM执行原生SQL语句

    # 1.connectionfrom django.db import connection, connections cursor = connection.cursor() # cursor = ...