[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大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...
随机推荐
- NavigationView的使用
代码已经分享至github:https://github.com/YanYoJun/NavigationDemo 转载请注明原文链接:http://www.cnblogs.com/yanyojun/p ...
- Android SpannableString及字体设置
import android.content.Context; import android.graphics.Color; import android.text.SpannableString; ...
- nginx访问php程序相关配置
server { listen *:80; charset utf-8; server_name roujiaxiaomowang.wanghaokun.com mowang.crucco.com; ...
- [Windows Server 2008] PHP安装Memcached
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Windows ...
- vue中的组件传值
组件关系可以分为父子组件通信.兄弟组件通信.跨级组件通信. 父传子 - props 子传父 - $emit 跨级可以用bus 父子双向 v-model 父链(this.$parent this.$ch ...
- JS 水印图片合成实例页面
CSS代码: .clip { position: absolute; clip: rect(0 0 0 0); } HTML代码: <input type="file" id ...
- 趣味ACM题——圣骑士的斩杀
题目来源于山东省第七届ACM大学生程序设计竞赛(Execution of Paladin) 题目描述 鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7 ...
- 「 HDU P4734 」 F(x)
# 题目大意 对于一个数 $x$,它的每一位数字分别是 $A_{n}A_{n-1}A_{n-2}\cdots A_{2}A_{1}$,定义其权重 $f(x)=\sum_{i=1}^{n}\left(A ...
- BZOJ 3144 切糕 最小割
题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...
- 笔试算法题(13):反转链表 & 左旋转字符串
出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...