【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)的$的 所以 ...
随机推荐
- beta冲刺5
昨天的问题: 登陆页面的整合重新制作 各主机版本更迭 我的社团显示功能修改调整 主页的头部替换掉 +修复帖子无法显示内容的问题 +试着将邮箱等判定用正则表达式进行实时判定. 今天的完成: 主要是线下进 ...
- android 广播,manifest.xml注册,代码编写
1.种 private void downloadBr(File file) { // 广播出去,由广播接收器来处理下载完成的文件 Intent sendIntent = new Intent ...
- machine learning 之 导论 一元线性回归
整理自Andrew Ng 的 machine learnig 课程 week1. 目录: 什么是机器学习 监督学习 非监督学习 一元线性回归 模型表示 损失函数 梯度下降算法 1.什么是机器学习 Ar ...
- php后台的在控制器中就可以实现阅读数增加
$smodel=M('Sswz');$smodel->where($map)->setInc('view' ,1);php后台的在控制器中就可以实现阅读数增加前台不需要传值
- 你能选择出,前几个元素吗?使用纯css
面试被问到 ,你能选择出前几个元素吗?括弧只能使用css 我当时是一脸懵逼... 回去的路上思考一路 终于想到了解决办法 虽然为时已晚 但是觉得很有意义... 首先要用到 否定选择器 : :not() ...
- CentOS7下安装python-pip
一.检查是否已经安装 检查linux有没有安装python-pip包,直接执行:: yum install python-pip 二.安装 pip install 1.没有python-pip包就执行 ...
- apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析
一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...
- final类与final方法
inal---用于类.方法前. final类---不可被继承. final方法---不可被覆盖. final类不能被继承. 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被继 ...
- 转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)
NLP+句法结构(三)︱中文句法结构(CIPS2016.依存句法.文法)转自:https://www.cnblogs.com/maohai/p/6453389.html 摘录自:CIPS2016 中文 ...
- apache修改最大连接数报错
报错的内容: AH00180: WARNING: MaxRequestWorkers of 2500 exceeds ServerLimit value of 256 servers, decreas ...