【BZOJ2733】【HNOI2012】永无乡
题意:给你N个带权点,一开始相互独立(每个点视为单独一个集合),有2种操作:1)合并2个集合;2)查询包含某元素集合内的权值第k小点编号。
解题思路:显然合并就是并查集,而查询则是平衡树实现。
考虑对每个集合开一棵平衡树,这样的话直接合并2棵平衡树的效率最坏是\( n \log n \)的,显然会TLE。
考虑使用启发式合并,这样就可以将合并的集合树的深度严格限制在\( \log n \)内,于是每次合并的效率就约为 \( \log^{2} n \)的。这样就不会TLE了。
时间效率:操作1:\( \log^{2} n \) ; 操作2: \( \log n \).
注意一下如果已经在一个集合内就不要合并了。
总复杂度:\( O( (m+q) \log^{2} n) \) / \( O(n) \).
AC代码:(1312ms/4688KB on BZOJ)
#include <stdio.h>
#define r register
#define MN 100005
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),S==TT)?EOF:*S++)
char BB[<<],*S=BB,*TT=BB;
inline int read(){
r int x=,f=; r char ch=getchar();
while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}inline int rad(){
static int x=;
return x^=x<<,x^=x>>,x^=x<<;
}
struct treap{
treap *ls,*rs;
int sz,val,ord,pri;
void combine(){
sz=;
if (ls!=NULL) sz+=ls->sz;
if (rs!=NULL) sz+=rs->sz;
}treap(int val,int ord):ord(ord),val(val){ls=rs=NULL,sz=,pri=rad();}
}*root[MN];
inline void lturn(treap* &x){r treap *y=x->rs; x->rs=y->ls; y->ls=x; y->sz=x->sz; x->combine(); x=y;}
inline void rturn(treap* &x){r treap *y=x->ls; x->ls=y->rs; y->rs=x; y->sz=x->sz; x->combine(); x=y;}
inline void Insert(treap* &x,int val,int ord){
if (x==NULL) {x=new treap(val,ord);return;}x->sz++;
if (val<x->val){Insert(x->ls,val,ord);if (x->ls->pri<x->pri) rturn(x);}
else{Insert(x->rs,val,ord);if (x->rs->pri<x->pri) lturn(x);}
}
inline void merge(treap* &o,treap* &x){
if (o==NULL) return;
merge(o->ls,x);merge(o->rs,x);
Insert(x,o->val,o->ord);
delete o;o=NULL;return;
}
inline int query(treap *x,int k){
if (x==NULL||k<||k>x->sz) return -;
if (x->ls==NULL){
if (k==) return x->ord;
return query(x->rs,k-);
}
if (k<=x->ls->sz) return query(x->ls,k);
if (k==x->ls->sz+) return x->ord;
return query(x->rs,k-x->ls->sz-);
}
int fa[MN],n,q;
inline int getfa(int x){return fa[x]?fa[x]=getfa(fa[x]):x;}
void init(){
n=read(),q=read();
for (int i=; i<=n; ++i) Insert(root[i],read(),i);
while(q--){
r int x=getfa(read()),y=getfa(read()); if (x==y) continue;
if (root[x]->sz<root[y]->sz) merge(root[x],root[y]),fa[x]=y;
else merge(root[y],root[x]),fa[y]=x;
}
}
void solve(){
q=read();while (q--){
r char op=getchar();while(op!='Q'&&op!='B') op=getchar();
r int x=read(),y=read();
if (op=='Q') printf("%d\n",query(root[getfa(x)],y));
else{
x=getfa(x),y=getfa(y); if (x==y) continue;
if (root[x]->sz<root[y]->sz) merge(root[x],root[y]),fa[x]=y;
else merge(root[y],root[x]),fa[y]=x;
}
}
}
int main(){init(); solve(); return ;}
【BZOJ2733】【HNOI2012】永无乡的更多相关文章
- bzoj2733: [HNOI2012]永无乡 启发式合并
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec ...
- bzoj2733: [HNOI2012]永无乡(splay)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3778 Solved: 2020 Description 永 ...
- [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4108 Solved: 2195[Submit][Statu ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- bzoj2733: [HNOI2012]永无乡 线段树合并
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...
- BZOJ2733: [HNOI2012]永无乡(线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ2733 [HNOI2012]永无乡
直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...
随机推荐
- Rails Migration Data Model栏位修改及数据类型介绍
测试版本Ruby:2.3.1 Rails:5.0.1 一.增加栏位 给devise默认的用户新增增加username字段 $ rails generate migration add_ ...
- C语言第五次作业--数据类型
7-2 区位码输入法: 1. 本题PTA提交列表: 2.设计思路: 1.simple定义输入数,character1和character2分别定义低字节和高字节区位码,digit存储取余后的数,sum ...
- 高级软件工程2017第6次作业——团队项目:Alpha阶段综合报告
1.版本测试报告 1.1在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? Bug分类 Bug内容 Fixed 编辑博文时改变文字格式会刷新界面 Can't reproduced 无 N ...
- Alpha冲刺No.6
站立式会议 继续页面设计 在安卓内构件数据库相应类 解决摄像头.照片的使用的异常问题 二.实际项目进展 页面设计完成百分80 类架构完成 在虚拟机中,能够完成摄像头的调用和程序的使用 三.燃尽图 四. ...
- 每日冲刺报告——Day5(Java-Team)
第五天报告(11.6 周一) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...
- 1013团队Beta冲刺day1
项目进展 李明皇 今天解决的进度 点击首页list相应条目将信息传到详情页 明天安排 优化信息详情页布局 林翔 今天解决的进度 前后端连接成功 明天安排 开始微信前端+数据库写入 孙敏铭 今天解决的进 ...
- print 函数设置字体颜色
格式:\033[显示方式;前景色;背景色m数值表示的参数含义:显示方式: 0(默认值).1(高亮).22(非粗体).4(下划线).24(非下划线). 5(闪烁).25(非闪烁).7(反显).27(非反 ...
- 新概念英语(1-29)Come in, Amy.
How must Amy clean the floor? A:Come in, Amy. Shut the door, please. This bedroom's very untidy. B:W ...
- Spring Security 入门(1-3-1)Spring Security - http元素 - 默认登录和登录定制
登录表单配置 - http 元素下的 form-login 元素是用来定义表单登录信息的.当我们什么属性都不指定的时候 Spring Security 会为我们生成一个默认的登录页面. 如果不想使用默 ...
- PHP环境配置(1)
Apache下载 Apache下载地址:http://httpd.apache.org/download.cgi 第一步:点击Files for Microsoft Windows 第二步:点击Apa ...