解题:HNOI 2012 永无乡
并查集维护连通性,然后暴力启发式合并就完了,记得合并时边DFS边清空数组
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int val[N],siz[N],rnk[N],son[N][];
int aset[N],volu[N],root[N];
int n,m,x,y,t1,t2,tot;
char rd[];
int finda(int x)
{
return x==aset[x]?x:aset[x]=finda(aset[x]);
}
void Pushup(int nde)
{
siz[nde]=siz[son[nde][]]+siz[son[nde][]]+;
}
int Create()
{
siz[++tot]=;
rnk[tot]=rand();
return tot;
}
int Merge(int x,int y)
{
if(!x||!y)
return x+y;
else if(rnk[x]<=rnk[y])
{
son[x][]=Merge(son[x][],y);
Pushup(x); return x;
}
else
{
son[y][]=Merge(x,son[y][]);
Pushup(y); return y;
}
}
void Split(int nde,int &x,int &y,int tsk)
{
if(!nde) x=y=;
else
{
if(val[nde]<=tsk)
x=nde,Split(son[nde][],son[nde][],y,tsk);
else
y=nde,Split(son[nde][],x,son[nde][],tsk);
Pushup(nde);
}
}
int Query(int nde,int tsk)
{
if(tsk<=siz[son[nde][]]) return Query(son[nde][],tsk);
else if(tsk==siz[son[nde][]]+) return nde;
else return Query(son[nde][],tsk-siz[son[nde][]]-);
}
void Insert(int &nde,int tsk)
{
Split(nde,x,y,val[tsk]);
nde=Merge(Merge(x,tsk),y);
}
void DFS(int &gal,int nde)
{
if(son[nde][]) DFS(gal,son[nde][]);
if(son[nde][]) DFS(gal,son[nde][]);
son[nde][]=son[nde][]=; Insert(gal,nde);
}
void Unite(int x,int y)
{
int f1=finda(x),f2=finda(y);
if(volu[f1]<volu[f2]) swap(f1,f2);
volu[f1]+=volu[f2],aset[f2]=f1;
DFS(root[f1],root[f2]);
}
int main ()
{
srand();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&val[i]);
root[i]=Create();
aset[i]=i,volu[i]=;
}
while(m--)
scanf("%d%d",&t1,&t2),Unite(t1,t2);
scanf("%d",&m);
while(m--)
{
scanf("%s%d%d",rd,&t1,&t2);
if(rd[]=='B')
scanf("%d%d",&t1,&t2),Unite(t1,t2);
else
{
int ans=Query(root[finda(t1)],t2);
ans?printf("%d\n",ans):printf("-1\n");
}
}
return ;
}
解题:HNOI 2012 永无乡的更多相关文章
- HNOI 2012 永无乡
codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛 时间限制: 1 s 空间限制: 128000 KB 题目描述 Des ...
- BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并
题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...
- HNOI(湖南省选试题)——永无乡
今天写了一道十分巧妙的数据结构题---永无乡 (看的题解......) 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 ...
- [BZOJ2733][HNOI2010]永无乡 解题报告 启发式合并,线段树合并
好久没更新博客了,前段时间一直都在考试,都没时间些,现在终于有点闲了(cai guai)... 写了一道题,[HNOI2012]永无乡,其实是一道板子题,我发现我写了好多板子题...还是太菜了... ...
- 洛谷 P3224 [HNOI2012]永无乡 解题报告
P3224 [HNOI2012]永无乡 题目描述 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733 永无乡【splay启发式合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733: [HNOI2012]永无乡(线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ 2733 【HNOI2012】 永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
随机推荐
- Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息
目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...
- [network]交换机中用户权限
LEVEL 0(访问级):可以执行用于网络诊断等功能的命令.包括ping.tracert.telnet等命令,执行该级别命令的结果不能被保存到配置文件中. LEVEL 1(监控级):可以执行用于系统维 ...
- JAVA学习笔记--匿名内部类
匿名内部类,即没有名字的内部类. 我们在编写JAVA程序时,往往要创建很多类,类是可以被重复使用的.但有时,我们创建了一个类,却只需要使用该类一次,那么单独为其编写一个类就显得有些麻烦,这时可以使用匿 ...
- 基于preteus的1602液晶显示器的学习(LM016L)
(证明学过,以示纪念) 所谓1602就是每行可以显示16个字符,可以显示两行.1602液晶在工业中使用比较广泛,其基本都采用的是HD44780控制器,或者兼容该指令集,因此基于HD44780写的控制程 ...
- eclipse启动一闪而退
eclipse启动一闪而退 打开eclipse,启动画面一闪而过退出. 解决方法: 以下每一步结束都重启eclipse一下,看能不能正常启动. 1. 在C:/WINDOWS/system32 系统文件 ...
- Python常用模块之hashlib
Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据 import hashlib hash = hashlib.m ...
- 20170928-3 四则运算psp
1.本周psp: 2.本周进度条: 3.累计进度图(折线图): 4.psp饼状图:
- JS 操作 checkbox(cc角色管理等)
1.获取选中的权限的个数 var size=$("input[name='privileges']:checked").size();
- 查看dll依赖项
win7 系统: 开始-->所有程序->vs2012文件夹->vs tools->对应的命令提示符 输入命令: dumpbin /dependents 你的文件(可以是exe, ...
- 每日scrum--No.1
Yesterday:无 Today: 查找学校的官方地图和亲自测试其准确性 Problem :不能使地图适应我们的软件;未解决地图上存在的问题: 明天继续加油.