cogs1341 永无乡
cogs1341 永无乡
打了一发替罪羊树。
鬼故事:替罪羊树去掉重构(变成裸的二叉排序树)依然跑得过= =
启发式合并。每次把小的里面所有东西往大的里面一丢,每个点最多被丢\(log_2n\)次(丢一次大小至少*2)
然后这题就写完了(替罪羊树很暴力,启发式合并也很暴力)
还要搞个并查集维护连通性,连通的就不用再合了。
(好像不兼容O2)
// It is made by XZZ
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0;rg bool flg=0;rg char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')flg=1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return flg?-x:x;
}
const double alpha=0.723333;
const int maxn=100010;
int fa[maxn];
int siz[maxn],v[maxn],ch[maxn][2];
il int hd(int a){return a==fa[a]?a:fa[a]=hd(fa[a]);}
il int*_insert(int&x,const int&y){
if(!x){x=y,siz[x]=1,ch[x][0]=ch[x][1]=0;return NULL;}
++siz[x];
int*p=_insert(ch[x][v[y]>v[x]],y);
if(alpha*siz[x]<max(siz[ch[x][0]],siz[ch[x][1]]))p=&x;
return p;
}
int tot,res[maxn];
il vd _dfs(const int&x){if(x)_dfs(ch[x][0]),res[++tot]=x,_dfs(ch[x][1]);}
il vd redo(const int&x,const int &k){if(x)_dfs(ch[x][0]),_dfs(ch[x][1]),fa[x]=k;}
il int divide(int l,int r){
if(l>r)return 0;
int mid=(l+r)>>1;
ch[res[mid]][0]=divide(l,mid-1);
ch[res[mid]][1]=divide(mid+1,r);
siz[res[mid]]=r-l+1;
return res[mid];
}
il vd insert(int&x,const int&y){
int*p=_insert(x,y);
if(p){//这里if(p)改成if(0)就是裸的BST
int&k=*p,s;
tot=0,_dfs(k);
if(k==x)s=divide(1,tot),fa[x]=x=fa[s]=s;
else k=divide(1,tot);
}
}
il vd dfs(const int&x,int&y){
if(!x)return;
dfs(ch[x][0],y),dfs(ch[x][1],y);
insert(y,x);
}
il vd Union(int a,int b){
int A=hd(a),B=hd(b);
if(A==B)return;
if(siz[A]>siz[B])dfs(B,A),fa[B]=A;
else dfs(A,B),fa[A]=B;
}
int main(){
int n=gi(),m=gi();
rep(i,1,n)v[i]=gi(),siz[i]=1,fa[i]=i;
while(m--)Union(gi(),gi());
int q=gi();char opt[2];
while(q--){
scanf("%s",opt);
if(opt[0]=='Q'){
static int x,y;
x=hd(gi()),y=gi();
if(siz[x]<y){puts("-1");continue;}
while(1){
if(siz[ch[x][0]]+1==y){printf("%d\n",x);break;}
if(y<=siz[ch[x][0]])x=ch[x][0];
else y-=siz[ch[x][0]]+1,x=ch[x][1];
}
}else Union(gi(),gi());
}
return 0;
}
cogs1341 永无乡的更多相关文章
- BZOJ 2733 【HNOI2012】 永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 【BZOJ-2733】永无乡 Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2048 Solved: 1078[Submit][Statu ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 2733: [HNOI2012]永无乡 - BZOJ
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- bzoj 2733: [HNOI2012]永无乡 离线+主席树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1167 Solved: 607[Submit][Status ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733 永无乡【splay启发式合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- HNOI(湖南省选试题)——永无乡
今天写了一道十分巧妙的数据结构题---永无乡 (看的题解......) 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 ...
随机推荐
- php中session中的反序列
1.php 键名 + 竖线 + 经过 serialize() 函数反序列处理的值2.php_binary 键名的长度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数 ...
- Spark Streaming和Kafka集成深入浅出
写在前面 本文主要介绍Spark Streaming基本概念.kafka集成.Offset管理 本文主要介绍Spark Streaming基本概念.kafka集成.Offset管理 一.概述 Spar ...
- PHP面试系列 之Linux(三)---- Vi/Vim编辑器
vi 是 unix 家族下最功能强大的文字编辑器,而 vim 則是 vi 的加强版, 编辑模式 指令 說明 * i 在游標位置進入編輯模式 I 在游標行的第一個非空白字元進入編輯模式 * a ...
- TS流基本概念
在MPEG-2标准中,有两种不同类型的码流输出到信道:一种是节目码流(Program Stream, PS),适用于没有误差产生的媒体存储,如DVD等存储介质:另一种是传送流(Transport st ...
- HttpWebRequest类,及如何使用Cookie(转载)
HttpWebRequest类与HttpRequest类的区别.HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReques ...
- 记一次jvm异常排查及优化
为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容 有次接到客服反馈,生产系统异常,无法访问.接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常 ...
- 查询表空间及已使用情況的SQL语句
语句一: select f.tablespace_name tablespace_name, round((d.sumbytes / 1024 / 1024 / 1024), 2) total_g, ...
- Angular7教程-05-搭建项目环境
1. 本节说明 本节以及后面的内容我们将会通过搭建一个简单的博客程序来对angular进行介绍,项目使用前端框架是bootstrap.版本v3.3.7,另外需要安装jquery.关于bootstrap ...
- Java单例模式几种实现方式
在平时的工作.学员的学习以及面试过程中,单例模式作为一种常用的设计模式,会经常被面试官问到,甚至笔试会要求学员现场默写,下面将会就单例模式的实现思路和几种常见的实现方式进行简单的分享. 单例模式,是一 ...
- parseInt("08")或parseInt("09")转换返回0的解决办法
在javascript中使用parseInt()函数转换成整数时会遇到以下这种情况: 使用parseInt()转换'01'~'07'时可以转换成整数1~7,而转换'08'和'09'时,就会出现转换结果 ...