[bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012
题目大意:题目链接。
注释:略。
想法:
它的查询操作非常友善,就是一个联通块内的$k$小值。
故此我们可以考虑每个联通块建一棵权值线段树。
这样的话每次修改采用线段树启发式合并,查询暴力走权值线段树即可。
Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
struct Node
{
int ls,rs,size;
Node() {ls=rs=size=0;}
}a[N*50];
int rt[N],fa[N],cnt,val[N],re[N];
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
int merge(int x,int y)
{
if(!x||!y) return x|y;
a[x].size+=a[y].size;
a[x].ls=merge(a[x].ls,a[y].ls); a[x].rs=merge(a[x].rs,a[y].rs);
return x;
}
int query(int x,int k,int l,int r)
{
if(l==r) return l;
int ls=a[x].ls,rs=a[x].rs;
int mid=(l+r)>>1;
if(k<=a[ls].size) return query(ls,k,l,mid);
else return query(rs,k-a[ls].size,mid+1,r);
}
int build(int x,int l,int r)
{
// printf("%d %d %d\n",x,l,r);
int p=++cnt;
a[p].size=1;
if(l==r) return p;
int mid=(l+r)>>1;
if(x<=mid) a[p].ls=build(x,l,mid);
else a[p].rs=build(x,mid+1,r);
return p;
}
int main()
{
int n,m; cin >> n >> m ; for(int i=1;i<=n;i++) scanf("%d",&val[i]),re[val[i]]=i,fa[i]=i;
for(int i=1;i<=n;i++) rt[i]=build(val[i],1,n);
// for(int i=1;i<=n;i++) cout << rt[i] << " " ; puts("");
for(int x,y,i=1;i<=m;i++)
{
scanf("%d%d",&x,&y); x=find(x); y=find(y);
if(x!=y)
{
rt[x]=merge(rt[x],rt[y]);
fa[y]=x;
}
}
// for(int i=1;i<=n;i++) printf("%d ",find(i)); puts("");
int q; cin >> q ; while(q--)
{
char opt[10]; int x,y; scanf("%s%d%d",opt,&x,&y);
if(opt[0]=='B')
{
x=find(x); y=find(y);
if(x!=y)
{
rt[x]=merge(rt[x],rt[y]); fa[y]=x;
}
}
else
{
x=find(x);
if(y>a[rt[x]].size) puts("-1");
else printf("%d\n",re[query(rt[x],y,1,n)]);
}
}
return 0;
}
小结:这题是别人好几个月之前写的,当时觉得贼高级现在一看原来是sb题.....
[bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并的更多相关文章
- [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4108 Solved: 2195[Submit][Statu ...
- 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]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 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启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- [BZOJ2733] [HNOI2012]永无乡(并查集 + 线段树合并)
传送门 一看到第k大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...
随机推荐
- 8.JAVA-向上转型、向下转型
父子对象之间的转换分为了向上转型和向下转型,它们区别如下: 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围) ...
- JS中的逻辑运算符&&、||,位运算符|,&
1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是fals ...
- vue-webpack所构建好的项目中增加Eslint
首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...
- OpenGL Column-Major Matrix 使用注意事项
这column major的矩阵是彻底把我搞晕了,以后右乘规则下的矩阵应该这么用 假设我想创建一个2x2的矩阵,数学上我这么写: 1 2 3 4 用代码创建的话这么写 // 按照 row major ...
- 利用ObjectMapper readValue()和泛型解决复杂json结构
import com.dj.fss.vo.MessageListVO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; im ...
- HP11.31安装11.2.0.3实施手册
1 前言 此文档详细描述了Oracle 11gR2 数据库在HP11.31上的安装RAC的检查及安装步骤.文档中#表示root用户执行,$表示grid或oracle用户执行. 2 系统环境 操作系统环 ...
- Python2和Python3除法
Python2和Python3除法 Python2除法:/,//,% "/":整数相除,向下取整:浮点数相除,结果包含小数(类似1/2,想保留小数应该写成1.0/2或者1*1. ...
- 【Linux】CentOS tar压缩与解压命令大全
tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...
- 用npm来部署快速一个httpweb服务器
https://blog.csdn.net/u012182627/article/details/55060594 http-server的安装######注意事项 安装http-server的时候 ...
- 输入一个字符串输出ASCII的十六进制值
#include <stdio.h> #include <string.h> #define LEN 1024 void main() { char s[LEN] = &quo ...