【BZOJ】【2733】【HNOI2012】永无乡
平衡树+启发式合并+并查集
因为要求一坨数中第k大的……用平衡树会很好维护……
但又要求连通块?所以用并查集来维护……
大概就是让并查集的fa和Treap的根是同一个节点吧……
TLE了N多发,可能是Treap的随机rank看脸的原因……QAQ
唯一过了的一次是小号……
/**************************************************************
Problem: 2733
User: ProgrammingApe
Language: C++
Result: Accepted
Time:2356 ms
Memory:3640 kb
****************************************************************/ //BZOJ 2733
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*=sign;
}
/*******************tamplate********************/
const int N=;
struct node{
int ch[];
int rk,v,size;
node(){}
#define L t[o].ch[0]
#define R t[o].ch[1]
}t[N];
int fa[N],n;
int getfa(int x){ return fa[x]==x ? x : getfa(fa[x]); }
inline void push_up(int o){
t[o].size=t[L].size+t[R].size+;
}
inline void rotate(int &o,int d){
int k=t[o].ch[!d];
t[o].ch[!d]=t[k].ch[d];
t[k].ch[d]=o;
push_up(o);
o=k;
}
inline void insert(int &o,int x){
if (!o){
o=x; t[o].size=; L=R=;
t[o].rk=rand();
}
else{
t[o].size++;
if (t[x].v<t[o].v){
insert(L,x);
if (t[L].rk<t[o].rk) rotate(o,);
}
else{
insert(R,x);
if (t[R].rk<t[o].rk) rotate(o,);
}
push_up(o);
}
}
inline void merge(int x,int y){//将x向y合并
if (x==) return;
merge(t[x].ch[],y); merge(t[x].ch[],y);
insert(y,x);
}
inline void solvemerge(){
int x=getint(), y=getint();
int f1=getfa(x),f2=getfa(y);
if (f1==f2) return;
if (t[f1].size>t[f2].size) swap(f1,f2);
fa[f1]=f2;
merge(f1,f2);
}
inline int kth(int o,int k){
while(o){
if (!o || k<= || k>t[o].size) return -;
int s=t[L].size;
if (k==s+) return o;
else if (k<=s) o=L;
else {o=R; k=k-s-;}
}
return -;
}
int main(){
n=getint();
int m=getint(),x,y;
F(i,,n){
t[i].v=getint();
fa[i]=i; t[i].size=; t[i].ch[]=t[i].ch[]=;
}
F(i,,m) solvemerge();
int q=getint();
char cmd[];
F(i,,q){
scanf("%s",cmd);
if (cmd[]=='Q'){
x=getint(); y=getint();
int f1=getfa(x);
printf("%d\n",kth(f1,y));
}
else solvemerge();
}
return ;
}
【BZOJ】【2733】【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 ...
- bzoj 2733: [HNOI2012]永无乡 -- 线段树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...
- Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3955 Solved: 2112[Submit][Statu ...
- Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...
- 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...
- bzoj 2733: [HNOI2012]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- bzoj 2733 : [HNOI2012]永无乡 (线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
随机推荐
- MySQL中DATE_FORMATE函数内置字符集解析
今天帮同事处理一个SQL(简化过后的)执行报错: 代码如下 复制代码 mysql> select date_format('2013-11-19','Y-m-d') > timediff( ...
- UI3_视图切换
// // ViewController.m // UI3_视图切换 // // Created by zhangxueming on 15/7/3. // Copyright (c) 2015年 z ...
- Spring IoC容器的设计—1—主线
IoC容器的接口设计图 下面对接口关系做一些简要的分析,可以依据以下内容来理解这张接口设计图. 从接口BeanFactory到HierarchicalBeanFactory,再到Configurabl ...
- Codevs 1009 产生数
题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...
- 《gpg文件加密的使用》RHEL6
甲端: 首先是要生成一对密钥: 提示是否要生成2048个字节的密钥对: 下面都是生成密钥对时的步骤: 按“o”键开始生成密钥对: 提示要我给密钥对加个密码: 输入2次 之后密钥对的字符需要我按键盘 ...
- 【linux】iptables 开启80端口
经常使用CentOS的朋友,可能会遇到和我一样的问题.开启了防火墙导致80端口无法访问,刚开始学习centos的朋友可以参考下. 经常使用CentOS的朋友,可能会遇到和我一样的问题.最近在Linux ...
- Odoo 库存管理-库存移动(Stock Move)新玩法
库存移动(Stock Move)新玩法 Odoo的库存移动不仅仅是存货在两个“存货地点”之间的移动的基本概念了,他们可以被“串联”在一起,可以用来生成或改变其对应的拣货单 (Picking).链式库存 ...
- vs2010中安装ASP.NET AJAX Control Toolkit
方法一: 第一步 下载Ajax Control Toolkit 进入网址http://ajaxcontroltoolkit.codeplex.com/ 即可下载 第二步 解压下载下来的Ajax Con ...
- openerp学习笔记 跟踪状态,记录日志,发送消息
跟踪状态基础数据: kl_qingjd/kl_qingjd_data.xml <?xml version="1.0"?><openerp> <d ...
- 无法创建链接服务器 "TEST" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例
在使用SQLserver建立远程服务连接Oracle的时候出现先下面错误 出现这个错误,我找到最常见的两个原因 1.注册表 <1>按下WIN+R,打开“运行”窗口,输入“regedit”, ...