[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大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...
随机推荐
- math数学函数
Console.WriteLine("Math.Sign(12)--->{0})", Math.Sign(12)) Console.WriteLine("math. ...
- 微信小程序组件解读和分析:十一、label标签
label标签组件说明: label标签,与html的label标签基本一样.label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发 ...
- qt5.5版本的creator构建套件自动检测为警告
原创,转载请注明http://www.cnblogs.com/dachen408/p/7226188.html 原因,安装qt在E盘,winsdksetup也在E盘 的原因,卸载winsdksetup ...
- vue2.0 vue.set()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android手机web网站拨打电话几种方式
1. <input name="phone" format="*m" value="13"/> <do type=&quo ...
- js 零散知识
# 同一种类型的事件注册多个事件句柄,后面的不会覆盖前面的事件 # event.which == 13,13代表回车 # parsley.js验证框架 # JSON.stringify, avoid ...
- ie11 突然不能加载外部css 很神奇 头部改为 <!DOCTYPE> <html>
<!DOCTYPE html> <html> 改为 <!DOCTYPE> <html> OK了
- Java IO(一)--File类
File类不是单指文件,它既可以代表一个文件名称,又可以代表一个目录下的一组文件.可以用来创建.删除.遍历文件等 public static void main(String[] args) { St ...
- java中属性命名get字母大小写问题
java文件 company.java private int sTime; public void setSTime (int sTime) { this.sTime = sTime; ...
- spring springmvc 获取所有url
@Autowired private RequestMappingHandlerMapping handlerMapping; @Test public void getAllApi() { Map& ...