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. 历史在重演:从KHTML到WebKit,再到Blink

    http://36kr.com/p/202396.html 上周四,Google宣布从WebKit 分支出自己的浏览器渲染引擎 Blink.很多人觉得这像是晴天霹雳,或者甚至是迟到的愚人节笑话,但是其 ...

  2. 11GR2 中的常见 RMAN 问题

    版权声明:本文为博主原创文章,欢迎转载验证并评论,谢谢! https://blog.csdn.net/li70803/article/details/34104511 本文是Oracle suppor ...

  3. Discuz!在线中文分词服务

    Discuz!在线中文分词服务是基于API返回分词结果的.在项目中,我们只需要一个函数即可方便地进行分词.关键词提取.以下是根据Discuz!在线分词服务API写的函数,测试可正常运行: 代码代码如下 ...

  4. 【[国家集训队]Crash的数字表格 / JZPTAB】

    这道题我们要求的是 \[\sum_{i=1}^N\sum_{j=1}^Mlcm(i,j)\] 总所周知\(lcm\)的性质不如\(gcd\)优雅,但是唯一分解定理告诉我们\(gcd(i,j)\time ...

  5. 随手练——HDU 1237 表达式求值(输入格式典型)

    坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...

  6. 如何批量下载bing的背景图片?

    工具准备 wget(点击下载) 批处理命令(点击下载) 网友提供的接口:http://area.sinaapp.com/bingImg?daysAgo=1(1代表天数) 实现步骤 1.打开记事本,并将 ...

  7. 20145314郑凯杰 《Java程序设计》第10周学习总结

    20145314郑凯杰 <Java程序设计>第10周学习总结 代码托管: 学习内容总结 网络编程 会打手机吗? 第一个问题:会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛 ...

  8. 【转】如何开发自己的HttpServer-NanoHttpd源码解读

    现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了.用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后 ...

  9. chromedriver linux windows各版本下载地址

    taobao镜像:https://www.baidu.com/link?url=gV12RWo7v_F-BDncFNKv_Rk9jF2nMix3Z7yMd84c2QvIB0LqcwxMxTPMUyb0 ...

  10. 减少 lwip 消耗 的 RAM

    1.修改 最大一包数据的大小 TCP_MSS , 即 TCP最大报文段大小,根据自己的应用进行修改 比如 我 的一包数据最大  256字节,在 lwipopts.h 文件中 因此 修改 如下: /* ...