[bzoj2733]永无乡&&[bzoj3545]Peaks
并不敢说完全会了线段树合并,只是至少知道原理写法了。。。还是太菜了,每天被大佬吊锤qwq
我看到的几道线段树合并都是权值线段树的合并。这个算法适用范围应该只是01线段树的。
这两道算入门题了吧。。。
发现粘题面没人看(自己都懒得看),以后粘链接加题意吧。
给$n$个没有连边的带权点,动态加边,询问$u$所在连通块权值第$k$大的点是什么。$n \leq 1e5 , q\leq 3e5$
给定森林,点有点权有重复!,边有边权。询问$u$所在连通块,只能走边权小于$w$的边,可达的权值第$k$大的点编号!是什么。$n \leq 1e5 , m,q \leq 5e5$ 被坑的巨惨qwq
后面的离线一下,按边权从小到大加进去就和永无乡一样了。
并查集维护连通性,并将两个连通块的权值线段树合并。询问就是在所在连通块线段树二分找。$(O(nlogn))$
#include<bits/stdc++.h>
using namespace std;
const int N=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
int fa[N],rt[N],n,m;
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
struct Node{
int L,R,sum;
}T[N*];
int sz;
#define ls T[o].L
#define rs T[o].R
void pullup(int o){
T[o].sum=T[ls].sum+T[rs].sum;
}
void ins(int &o,int l,int r,int v){
if(!o)o=++sz;
if(l==r){
T[o].sum=;return;
}
int mid=l+r>>;
if(v<=mid)ins(ls,l,mid,v);
else ins(rs,mid+,r,v);
pullup(o);
}
int merge(int x,int y){
if(!x)return y;
if(!y)return x;
T[x].L=merge(T[x].L,T[y].L);
T[x].R=merge(T[x].R,T[y].R);
pullup(x);
return x;
}
int query(int o,int l,int r,int rk){
if(l==r)return l;
int mid=l+r>>;
if(rk<=T[ls].sum)return query(ls,l,mid,rk);
else return query(rs,mid+,r,rk-T[ls].sum);
}
void Link(int x,int y){
int u=find(x),v=find(y);
fa[u]=v;rt[v]=merge(rt[u],rt[v]);
}
int a[N],id[N];
void init(){
n=read(),m=read();
for(int i=;i<=n;i++)
a[i]=read(),id[a[i]]=fa[i]=i;
while(m--){
int u=read(),v=read();
fa[find(u)]=find(v);
}
for(int i=;i<=n;i++)
ins(rt[find(i)],,n,a[i]);
}
void solve(){
m=read();
char s[];
while(m--){
scanf("%s",s);
if(s[]=='B'){
int u=read(),v=read();
Link(u,v);
}
else{
int u=find(read()),rk=read();
if(T[rt[u]].sum<rk)puts("-1");
else printf("%d\n",id[query(rt[u],,n,rk)]);
}
}
}
int main(){
init();
solve();
}
2733
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
int n,m,q;
struct Edge{
int u,v,w;
friend bool operator < (Edge p,Edge q){
return p.w<q.w;
}
}e[M];
struct ask{
int u,w,k,ans,id;
}a[M];
bool cmpw(ask p,ask q){
return p.w<q.w;
}
bool cmpid(ask p,ask q){
return p.id<q.id;
}
int fa[N],h[N],t[N],id[N];
inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int rt[N],sz;
struct Node{
int L,R,sum;
}T[N*];
#define ls T[o].L
#define rs T[o].R
#define mid (l+r>>1)
inline void pullup(int o){
T[o].sum=T[ls].sum+T[rs].sum;
}
void ins(int &o,int l,int r,int val){
if(!o)o=++sz;
if(l==r){
T[o].sum=;return;
}
if(val<=mid)ins(ls,l,mid,val);
else ins(rs,mid+,r,val);
pullup(o);
}
int query(int o,int l,int r,int rk){
if(l==r){
return t[l];
}
if(rk<=T[ls].sum)return query(ls,l,mid,rk);
else return query(rs,mid+,r,rk-T[ls].sum);
}
int merge(int x,int y){
if(!x)return y;
if(!y)return x;
if(!T[x].L&&!T[x].R){
T[x].sum+=T[y].sum;
return x;
}
T[x].L=merge(T[x].L,T[y].L);
T[x].R=merge(T[x].R,T[y].R);
pullup(x);return x;
}
inline void Link(int x,int y){
x=find(x),y=find(y);
if(x==y)return;
fa[y]=x;
rt[x]=merge(rt[x],rt[y]);
}
void init(){
n=read(),m=read(),q=read();
for(int i=;i<=n;i++)
h[i]=t[i]=read(),fa[i]=i;
sort(t+,t+n+);
for(int i=;i<=n;i++){
h[i]=lower_bound(t+,t+n+,h[i])-t;
ins(rt[i],,n,h[i]);
}
for(int i=;i<=m;i++)
e[i].u=read(),e[i].v=read(),e[i].w=read();
sort(e+,e+m+);
for(int i=;i<=q;i++)
a[i].u=read(),a[i].w=read(),a[i].k=read(),a[i].id=i;
sort(a+,a+q+,cmpw);
}
void solve(){
int now=;
for(int i=;i<=q;i++){
int lim=a[i].w,rk=a[i].k;
while(e[now].w<=lim&&now<=m){
Link(e[now].u,e[now].v);now++;
}
int u=find(a[i].u),siz=T[rt[u]].sum;
if(siz<rk){
a[i].ans=-;continue;
}
else rk=siz-rk+;
a[i].ans=query(rt[u],,n,rk);
}
sort(a+,a+q+,cmpid);
for(int i=;i<=q;i++)
printf("%d\n",a[i].ans);
}
int main(){
init();
solve();
}
3545

[bzoj2733]永无乡&&[bzoj3545]Peaks的更多相关文章
- BZOJ2733 永无乡【splay启发式合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733 永无乡 【splay启发式合并】
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4190 Solved: 2226 [Submit][Sta ...
- [BZOJ2733]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- bzoj2733永无乡
永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...
- bzoj2733 永无乡 splay树的启发式合并
https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...
- 【BZOJ2733】永无乡(线段树,并查集)
[BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]
[题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...
- 【BZOJ-2733】永无乡 Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2048 Solved: 1078[Submit][Statu ...
随机推荐
- Mysql学习第四天
1.跟用户相关的命令 (了解). DCL语句 1.1. 创建一个新的用户 CREATE USER 用户名@地址 IDENTIFIED BY '密码'; CREATE ...
- ASP.NET Core - VSCode安装和配置
在深入了解ASP.NET Core之前先研究了下主要的两个开发工具(VS 2015和VS Code), VS 2015对Core的支持已经相当的完备,很多操作得到简化用起来很是方便.VS Code是微 ...
- Html : 规范html代码的网站
html代码的规范也是很重要的,这里推荐一个网站,很好用,仓鼠是经常用的啦! https://htmlformatter.com/ 以上
- Educational Codeforces Round 14 - F (codeforces 691F)
题目链接:http://codeforces.com/problemset/problem/691/F 题目大意:给定n个数,再给m个询问,每个询问给一个p,求n个数中有多少对数的乘积≥p 数据范围: ...
- 进程—内存描述符(mm_struct)
http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员 ...
- vuejs动态组件和v-once指令
场景,点击某个按钮,两个子组件交替显示 <div id='root'> <child-one v-if='type==="child-one"'></ ...
- 引用类型(二):Array类型
一.js中的数组与其它语言中的数组的区别1.ECMAScript数组的每一项可以保存任何类型的数据2.ECMAScript数组的大小是可以动态调整的 二.创建数组的基本方式1.使用Array构造函数 ...
- 1.3配置存储单元(nbu重删池)
1.3配置存储单元 在备份或归档操作时,NetBackup将数据通过存储单元写到物理介质上,NetBackup支持三种类型的存储单元.即: 介质管理器.磁盘和NDMP. 1.3.1介质管理存储单元配置 ...
- 2017.10.13 Java中引用类型变量的创建及使用&循环高级写法
今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 ...
- Adobe CS2提供免费序列号
据Adobe官方博客报道,自2012年12月13日起,因为技术故障,该公司已停止使用Creative Suite(CS2)产品及Acrobat 7的激活服务器. 这些产品大多是7年前发布,很多已经无法 ...