2733

思路:

  启发式合并splay(n*log^2n);

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100001 int n,q,tot,ch[maxn*][],key[maxn*],w[maxn*],opi[maxn*],m;
int size[maxn*],root[maxn],id[maxn*],f[maxn],cnt,dis[maxn*],lar[maxn]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline int getson(int now)
{
return ch[opi[now]][]==now;
} inline void updata(int now)
{
size[now]=w[now];
if(ch[now][]) size[now]+=size[ch[now][]];
if(ch[now][]) size[now]+=size[ch[now][]];
} inline void rotate(int now)
{
int fa=opi[now],ffa=opi[fa],pos=getson(now);
ch[fa][pos]=ch[now][pos^];
if(ch[fa][pos]) opi[ch[fa][pos]]=fa;
if(ffa) ch[ffa][getson(fa)]=now;
ch[now][pos^]=fa,opi[fa]=now,opi[now]=ffa;
updata(fa),updata(now);
} inline void splay(int now,int to)
{
for(int fa;fa=opi[now];rotate(now))
{
if(opi[fa]) rotate(getson(now)==getson(fa)?fa:now);
}
root[to]=now;
} inline void insert(int x,int y,int to)
{
if(!root[to])
{
root[to]=++tot,key[tot]=x,w[tot]=size[tot]=,id[tot]=y;
return ;
}
int now=root[to],fa=;
while()
{
fa=now;
if(x<key[now]) now=ch[now][];
else now=ch[now][];
if(!now)
{
now=ch[fa][x>key[fa]]=++tot;
key[now]=x,id[now]=y,w[now]=size[now]=,opi[now]=fa;
splay(now,to);break;
}
}
} inline int find(int x)
{
if(x==f[x]) return x;
return f[x]=find(f[x]);
} inline int irank(int k,int to)
{
int now=root[to];
while()
{
int dis=size[ch[now][]];
if(k<=dis) now=ch[now][];
else
{
k-=dis;
if(k<=w[now])
{
splay(now,to);
return id[now];
}
else k-=w[now],now=ch[now][];
}
}
} inline void merge(int noww,int now)
{
if(!now) return ;
if(ch[now][]) merge(noww,ch[now][]);
insert(key[now],id[now],noww);
if(ch[now][]) merge(noww,ch[now][]);
} int main()
{
in(n),in(m);int x,y;char ch[];
for(int i=;i<=n;i++) in(dis[i]),f[i]=i,insert(dis[i],i,i),lar[i]=;
for(;m--;)
{
in(x),in(y);
x=find(x),y=find(y);
if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
if(x!=y) f[y]=x,merge(x,root[y]);
}
in(q);
for(;q--;)
{
scanf("%s",ch);in(x),in(y);
if(ch[]=='Q')
{
x=find(x);
if(y<=size[root[x]]) printf("%d\n",irank(y,x));
else printf("-1\n");
}
else
{
x=find(x),y=find(y);
if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
if(x!=y) f[y]=x,merge(x,root[y]);
}
}
return ;
}

AC日记——[HNOI2012]永无乡 bzoj 2733的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

  6. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  7. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

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

  8. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...

  9. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

随机推荐

  1. laravel - ReflectionException in Container.php, Class not found?

    SIGN UPSIGN IN CATALOG SERIES PODCAST DISCUSSIONS ReflectionException in Container.php, Class not fo ...

  2. Java8 时间处理

    Table of Contents 前言 时间单位和时区 时间点 时间段 时间的解析和格式化 时区时间 兼容旧接口 结语 前言 时间处理是一个经常会用到但又不那么好用的功能,其中的主要问题在于对人友好 ...

  3. Linux认知之旅【02 装个软件玩玩】!

    〇.命令行终端熟悉了吗? 1.没有仔细研究上一篇文章? 拿上看看这几个命令:ls.cd.cp.mv.rm.mkdir.touch.cat.less.恩,暂时这些够用了! 什么?你连虚拟机也没装! 感谢 ...

  4. 孤荷凌寒自学python第五十五天初识MongoDb数据库

    孤荷凌寒自学python第五十五天第一天初识MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 大家好,2019年新年快乐! 本来我想的是借新年第一天开始,正式尝试学习爬虫,结果今天偶然发现 ...

  5. Opencv4.0.0安装包

    这个资源是Opencv4.0.0安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  6. [转载]有关如何入门ACM

    来源: 吴垠的日志 一些题外话 首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发 ...

  7. 微信小程序--获取form表单初始值提交数据

    <form bindsubmit="formSubmit"> <view class="txt"> <view class=&qu ...

  8. 【linxu】部署docker容器虚拟化平台

    实验所涉内容 Docker 概述 部署 docker 容器虚拟化平台 docker 平台基本使用方法 创建docker镜像和发布镜像方法 Container 容器端口映射 一 Docker 概述 Do ...

  9. ubuntu16.04 搭建nexus+maven 学习

    /opt/nexus-2.10.0-02/bin vim nexus 关键配置: RUN_AS_USER=root JAVA_HOME=/usr/lib/java/jre export NEXUS_H ...

  10. ArcGIS 创建要素时提示“表已经被注册(table already registered)”

    今天一位实施大哥在ArcCatalog中要重建一个要素类,所以就在ArcCatalog中连接上Oracle数据库,直接删除了要素类,然后重新创建了一个新的要素类,可是却报错“表已经被创建”,并提示不可 ...