【bzoj2733】 HNOI2012—永无乡
http://www.lydsy.com/JudgeOnline/problem.php?id=2733 (题目链接)
题意
给出图上$n$个点,每个点有一个点权,每次询问一个连通块中点权第$K$小的点是谁,或者连接两个点。
Solution
权值线段树合并。
细节
也许会有负数?
代码
// bzoj2733
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define lim 1000000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,m,Q,sz,rt[maxn],fa[maxn],size[maxn];
struct node {
int son[2],s,id;
int& operator [] (int x) {return son[x];}
}tr[maxn*40]; namespace Segtree {
void build(int &k,int l,int r,int val,int id) {
if (!k) k=++sz;
if (l==r) {tr[k].s=1;tr[k].id=id;return;}
int mid=(l+r)>>1;
if (val<=mid) build(tr[k][0],l,mid,val,id);
else build(tr[k][1],mid+1,r,val,id);
tr[k].s=tr[tr[k][0]].s+tr[tr[k][1]].s;
}
int merge(int u,int v) {
if (!u || !v) return u|v;
tr[u][0]=merge(tr[u][0],tr[v][0]);
tr[u][1]=merge(tr[u][1],tr[v][1]);
tr[u].s=tr[tr[u][0]].s+tr[tr[u][1]].s;
return u;
}
int query(int u,int l,int r,int k) {
if (l==r) return tr[u].id;
int mid=(l+r)>>1,c=tr[tr[u][0]].s;
if (c>=k) return query(tr[u][0],l,mid,k);
else return query(tr[u][1],mid+1,r,k-c);
}
}
using namespace Segtree; int find(int x) {
return x==fa[x] ? x : fa[x]=find(fa[x]);
}
int main() {
scanf("%d%d",&n,&m);
for (int x,i=1;i<=n;i++) {
scanf("%d",&x);fa[i]=i;size[i]=1;
build(rt[i],-lim,lim,x,i);
}
for (int u,v,i=1;i<=m;i++) {
scanf("%d%d",&u,&v);
u=find(u),v=find(v);
if (size[u]<size[v]) swap(u,v);
fa[v]=u;size[u]+=size[v];
rt[u]=merge(rt[u],rt[v]);
}
scanf("%d",&Q);char ch[10];
for (int x,y,i=1;i<=Q;i++) {
scanf("%s%d%d",ch,&x,&y);
if (ch[0]=='Q') {
x=find(x);
printf("%d\n",size[x]<y ? -1 : query(rt[x],-lim,lim,y));
}
if (ch[0]=='B') {
x=find(x),y=find(y);
if (x!=y) {
if (size[x]<size[y]) swap(x,y);
fa[y]=x;size[x]+=size[y];
rt[x]=merge(rt[x],rt[y]);
}
}
}
return 0;
}
【bzoj2733】 HNOI2012—永无乡的更多相关文章
- bzoj2733: [HNOI2012]永无乡 启发式合并
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec ...
- bzoj2733: [HNOI2012]永无乡(splay)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3778 Solved: 2020 Description 永 ...
- [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4108 Solved: 2195[Submit][Statu ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- bzoj2733: [HNOI2012]永无乡 线段树合并
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...
- BZOJ2733: [HNOI2012]永无乡(线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ2733 [HNOI2012]永无乡
直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...
随机推荐
- 使用AD对Linux客户端进行身份验证
https://technet.microsoft.com/zh-cn/library/2008.12.linux.aspx
- Ubuntu16.04Server版离线安装Nginx1.8.1+Mysql5.7.23+Python3.6.2
nginx1.8.1 1.安装前准备工作 1.1.检查系统版本,确认源码编译所依赖的环境,提前下载好压缩包. 整个环境都是使用root权限安装,系统版本为server版的ubuntu16.04.4 r ...
- iOS 模块化、组件化方案探索(利用cocoapods 、git 创建私有仓库)
来自bang's blog http://blog.cnbang.net/tech/3080/ 模块化 简单来说,模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能 ...
- Node.js中module文件定义的top-level变量为何是私有的
在Node.js中,module文件里面使用var,const或者let定义的top-level变量为何是私有的,只能在这个模块文件中使用呢? 原因就是,在模块文件中的内容执行之前,node.js会降 ...
- Servlet学习小结
最近有点小累啊,上课平均一天6小时,再去修一修代码就没什么多的时间了.现在写我最近学习的成果:想想最近软件工程老师留的题目,我还有一些重要的地方没有想清楚.题目是这样的:生成四则运算的题目,算术题目包 ...
- 第1阶段冲刺成果—简单运算game(APP)
第1阶段冲刺成果 由于我们团队都没有Android的基础,所以在这一块花了很长的时间去学习探索,就连简单的Android的电脑配置也花了很长的时间,所以其他的DONE的都没有完成,这是失败的地方.但是 ...
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能 ...
- 软工网络15团队作业8——Beta阶段敏捷冲刺(Day2)
提供当天站立式会议照片一张 每个人的工作 1.讨论项目每个成员的昨天进展 赵铭: 根据计划安排,继续学习数据库. 吴慧婷:做Beta阶段的计划,并为界面设计寻找素材,学习界面优化. 陈敏: 根据任务, ...
- HDU 2086 A1 = ?
http://acm.hdu.edu.cn/showproblem.php?pid=2086 Problem Description 有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci ( ...
- sguf冲销脚本的实现
1.该脚本为PCISS项目的sguf冲销脚本: DECLARE type typ_sguf_table is table of sguf_rowid_tab_1%rowtype ; sguf_tab ...