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 永无乡的更多相关文章

  1. BZOJ 2733 【HNOI2012】 永无乡

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

  2. 【BZOJ-2733】永无乡 Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2048  Solved: 1078[Submit][Statu ...

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

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

  4. 2733: [HNOI2012]永无乡 - BZOJ

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

  5. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  6. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  7. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. BZOJ2733 永无乡【splay启发式合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. HNOI(湖南省选试题)——永无乡

    今天写了一道十分巧妙的数据结构题---永无乡 (看的题解......) 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 ...

随机推荐

  1. SQL进价2:三值逻辑和null

    1.SQL中的bool类型的值有三种 普通编程语言里的布尔型只有 true 和 false 两个值,这种逻辑体系被称为二值逻辑.而 SQL 语言里,除此之外还有第三个值 unknown,因此这种逻辑体 ...

  2. Odoo中Application与modules的区别

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278681.html 一:Application(应用) application一般是针对大功能的模块,如提供 ...

  3. 解决windows7无法连接CentOS7系统中oracle问题:ORA-12514 TNS 监听程序当前无法识别

    linux开启后终端按下面输入(容易忘记,记录下): [oracle@localhost ~]$ lsnrctl stop                #先关闭监听服务 [oracle@localh ...

  4. nginx下配置多个web服务

    参考 nginx配置详解  nginx反向代理与负载均衡详解 一.nginx简介: Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能 ...

  5. Java clone() 浅克隆与深度克隆

    内容转自:http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生 ...

  6. SSAS中CUBE的多对多关系既可以出现在中间事实表上也可以出现在中间维度表上

    开发过SSAS中CUBE的朋友,肯定都知道维度用法中的多对多关系, 这篇文章不想详细阐述多对多关系在CUBE中的结构,详情请在网上寻找CUBE多对多关系的介绍资料. 下面是是一个典型的CUBE中多对多 ...

  7. Hdu 5052 Yaoge’s maximum profit(树链剖分)

    题目大意: 给出一棵树.每一个点有商店.每一个商店都有一个价格,Yaoge每次从x走到y都能够在一个倒卖商品,从中得取利益.当然,买一顶要在卖之前.可是没次走过一条路,这条路上的全部商品都会添加一个v ...

  8. mongodb分组函数的使用(spring-data-mongodb)

    这两天要做mongodb日志的模块,下面记录一下. 一. 首先要导入一批数据,使用springboot来完成. 配置mongodb的复制集:在application.yml文件中配置uri来完成 格式 ...

  9. Xcode官方xip直接离线下载地址(更新到Xcode 9.4.1)

    Xcode 9.4.1 https://download.developer.apple.com/Developer_Tools/Xcode_9.4.1/Xcode_9.4.1.xip Xcode 9 ...

  10. Vector/Push_back

    https://bbs.csdn.net/topics/370225285 https://blog.csdn.net/u013630349/article/details/46853297 http ...