[HNOI2012]永无乡

Code1

权值线段树天然支持merge,线段树上二分求第k小

#include<bits/stdc++.h>using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const ll mod=998244353;
const int N=100010;
struct node
{int l,r;int v;
}tree[N*40];
int rt[N],cnt;
int n,m;
void insert(int &u,int l,int r,int x)
{if(!u) u=++cnt;tree[u].v++;if(l==r) return;int mid=l+r>>1;if(x<=mid) insert(tree[u].l,l,mid,x);else insert(tree[u].r,mid+1,r,x);
}
int fa[N],id[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
int merge(int u,int v)
{if(!u||!v) return u+v;tree[u].v+=tree[v].v;tree[u].l=merge(tree[u].l,tree[v].l);tree[u].r=merge(tree[u].r,tree[v].r);return u;}
int query(int u,int l,int r,int k)
{if(l==r) return id[l];int mid=l+r>>1;if(tree[tree[u].l].v<k) return query(tree[u].r,mid+1,r,k-tree[tree[u].l].v);return query(tree[u].l,l,mid,k);
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++){int x=rd();id[x]=i;insert(rt[i],1,n,x);}for(int i=1;i<=n;i++) fa[i]=i;while(m--){int u=rd(),v=rd();u=find(u),v=find(v);if(u==v) continue;fa[v]=u;rt[u]=merge(rt[u],rt[v]);}int qc=rd();while(qc--){char op[4];scanf("%s",op);int x=rd(),y=rd();if(op[0]=='Q') {int u=rt[find(x)];if(tree[u].v<y) puts("-1");else printf("%d\n",query(u,1,n,y));}else{int u=find(x),v=find(y);if(u==v) continue;fa[v]=u;rt[u]=merge(rt[u],rt[v]);}}return 0;
}

Code2

维护n课平衡树,启发式合并暴力合并。
平衡树支持第k小
pd_ds

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}const int N=500010;
int fa[N];
int n,m;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
ordered_set<pair<int,int>> rt[N];
void merge(int u,int v)// u<-v
{if(rt[u].size()<rt[v].size()) swap(u,v);ordered_set<pair<int,int>>::point_iterator it=rt[v].begin();for(;it!=rt[v].end();it++) rt[u].insert(*it);rt[v].clear();fa[v]=u;
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) rt[i].insert(pair<int,int>(rd(),i));for(int i=1;i<=n;i++) fa[i]=i;while(m--){int u=rd(),v=rd();u=find(u),v=find(v);if(u!=v) merge(u,v);}int qc=rd();while(qc--){char op[4];scanf("%s",op);int x=rd(),y=rd();if(op[0]=='Q') {int u=find(x);if(rt[u].size()<y) puts("-1");else printf("%d\n",rt[u].find_by_order(y-1)->second);}   else{int u=find(x),v=find(y);if(u!=v) merge(u,v);}}return 0;
}

P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)相关推荐

  1. 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  2. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...

  3. Luogu P3224 [HNOI2012]永无乡

    题目大意 给出若干个点集,每个点带点权.你需要完成 qqq 个操作. 合并点 uuu,vvv 所在的点集. 输出点 uuu 所在的点集中点权第 kkk 大的点的编号. 数据范围 1⩽n⩽100000, ...

  4. P3224 [HNOI2012]永无乡 FHQ-Treap 启发式合并

    题意: B x y B\ x\ y B x y 表示在岛 x x x 与岛 y y y 之间修建一座新桥. Q x k Q\ x\ k Q x k 表示询问当前与岛 x x x 连通的所有岛中第 k ...

  5. XSY1659 [HNOI2012]永无乡

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

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

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

  7. 数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

    因为非常板,所以主要是代码 Tyvj 1728 普通平衡树 Chef and Sets [HNOI2012]永无乡 Play with Chain [NOI2005]维修数列 题目很水,所以可能会出现 ...

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

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

  9. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

最新文章

  1. SAP MIGO对工单做101收货,报错 - Check table TFBEFU_CR entry 10 does not exist – 对策
  2. c语言函数打印零星,C语言零星笔记--(const、typedef)
  3. 初识canvas,使用canvas做一个百分比加载进度的动画
  4. 『ACM-算法-离散化』信息竞赛进阶指南--离散化
  5. 全新AI内参:量子位精心打磨,最新产业资讯、科研进展一文呈现
  6. 测试oracle的存储过程,测试技能:在oracle中自用存储过程进行测试数据构造
  7. composer 无法更新vonder
  8. 新兴IT企业特斯拉(六)——Win-Win
  9. 两个线性空间的可逆线性映射
  10. 中小型工厂如何玩转ERP生产管理系统
  11. python图片内容长度识别_python 图片中的表格识别
  12. 【项目】数据仓库概述
  13. Nginx配置项调优
  14. C# WinForm 功能代码备忘-刘欣
  15. Hash一致性算法(分片机制)
  16. 重写Github的TreeTableView库实现定制显示子节点
  17. C#程序无法连接本地数据库
  18. 一缕黑暗中的火光-----------顺序图--------------优雅的建模语言
  19. 简单的python截屏工具
  20. 基于像素的碰撞检测(移植到cocos2dx 3.x)

热门文章

  1. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
  2. java反射sethaha_Java反射深度测试
  3. 有必要服务器虚拟化吗,服务器虚拟化有必要吗
  4. office连接oracle,Access(VBA)连接Oracle数据库的代码
  5. PHP防QQ列表右划,react native 实现类似QQ的侧滑列表效果
  6. vue实现侧边折叠菜单栏手风琴效果
  7. [JavaWeb-MySQL]多表查询概述
  8. 高等数学下-赵立军-北京大学出版社-题解-练习9.1
  9. 洛谷 P1122 最大子树和-求树的最大子树权值和
  10. C++ struct实现顺序表