线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题解:
随便写写
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=(1e5)+,maxm=maxn,maxq=(3e5)+;
int N,M,W[maxn],fa[maxn],root[maxn],U,V,num_treenode=,Q,ans,belong[maxn];
char c;
inline int getf(int x){
if(fa[x]==x)return fa[x];
fa[x]=getf(fa[x]);
return fa[x];
}
struct Tree{int lc,rc,l,r,cnt;}tr[maxn*];
inline void Pushup(int x){
int lc=tr[x].lc,rc=tr[x].rc;
tr[x].cnt=tr[lc].cnt+tr[rc].cnt;
return;
}
inline void Build(int x,int l,int r,int q){
tr[x].l=l;tr[x].r=r;int mid=(l+r)>>;
if(l==r){
tr[x].cnt=;
return;
}
if(q<=mid)Build(tr[x].lc=++num_treenode,l,mid,q);
else Build(tr[x].rc=++num_treenode,mid+,r,q);
Pushup(x);
return;
}
inline int Merge(int u,int v){
if(!u)return v;
if(!v)return u;
int l=tr[u].l,r=tr[u].r;
if(l==r){
tr[u].cnt+=tr[v].cnt;
return u;
}
tr[u].lc=Merge(tr[u].lc,tr[v].lc);
tr[u].rc=Merge(tr[u].rc,tr[v].rc);
Pushup(u);
return u;
}
inline int Query(int x,int k){
int l=tr[x].l,r=tr[x].r,lc=tr[x].lc,rc=tr[x].rc;
if(l==r)return l;
if(tr[lc].cnt>=k)return Query(lc,k);
else return Query(rc,k-tr[lc].cnt);
}
int main(){
scanf("%d%d",&N,&M);
for(int i=;i<=N;i++){
scanf("%d",&W[i]);
fa[i]=i;
belong[W[i]]=i;
}
for(int i=;i<=N;i++)
Build(root[i]=++num_treenode,,N,W[i]);
for(int i=;i<=M;i++){
scanf("%d%d",&U,&V);
int fa1=getf(U),fa2=getf(V);
if(fa1!=fa2){
Merge(root[fa1],root[fa2]);
fa[fa2]=fa1;
}
}
scanf("%d",&Q);
while(Q--){
c=getchar();
while(c!='Q'&&c!='B')c=getchar();
scanf("%d%d",&U,&V);
if(c=='Q'){
int f=getf(U);
ans=Query(root[f],V);
if(ans==)ans=-;else ans=belong[ans];
printf("%d\n",ans);
}
else{
int fa1=getf(U),fa2=getf(V);
if(fa1!=fa2){
Merge(root[fa1],root[fa2]);
fa[fa2]=fa1;
}
}
}
return ;
}
By:AlenaNuna
线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡的更多相关文章
- BZOJ4399魔法少女LJJ——线段树合并+并查集
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)
题意 给出一个长度为 \(n\) 序列 , 每个位置有 \(a_i , b_i\) 两个参数 , \(b_i\) 互不相同 ,你可以进行任意次如下的两种操作 : 若存在 \(j \not = i\) ...
- Codeforces.1051G.Distinctification(线段树合并 并查集)
题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- BZOJ4530 BJOI2014大融合(线段树合并+并查集+dfs序)
易知所求的是两棵子树大小的乘积.先建出最后所得到的树,求出dfs序和子树大小.之后考虑如何在动态加边过程中维护子树大小.这个可以用树剖比较简单的实现,但还有一种更快更优美的做法就是线段树合并.对每个点 ...
- 【BZOJ2733】永无乡(线段树,并查集)
[BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)
题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树. 开始和队友 ...
随机推荐
- SpringBoot使用Redis共享用户session信息
SpringBoot引入Redis依赖: <dependency> <groupId>org.springframework.boot</groupId> < ...
- laravel 跨库执行原生 sql 语句
执行原生 sql 返回结果集
- eclipse快捷键 (包括查找类、方法、变量)
♦[Ct rl+T] 搜索当前接口的实现类 1. [ALT +/] 智能提示 此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时 ...
- 给Ubuntu系统清理垃圾
原文地址:https://blog.csdn.net/levon2018/article/details/81746613 1.清理下载的软件包 不过与你想象的可能有很大的不同,Ubuntu系统在运 ...
- 【原创】大数据基础之Flink(1)简介、安装、使用
Flink 1.7 官方:https://flink.apache.org/ 一 简介 Apache Flink is an open source platform for distributed ...
- Codeforces 809E Surprise me! [莫比乌斯反演]
洛谷 Codeforces 非常套路的一道题,很适合我在陷入低谷时提升信心-- 思路 显然我们需要大力推式子. 设\(p_{a_i}=i\),则有 \[ \begin{align*} n(n-1)an ...
- poj 1426 Find The Multiple (简单搜索dfs)
题目: Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal ...
- iOS -- Effective Objective-C 阅读笔记 (8)
若想令自己缩写的对象具有拷贝功能, 则需要实现 NSCopying 协议, 如果自定义的对象分为可变版本与不可变版本, 那么就要同时实现 NSCopying 协议和 NSMutableCopying ...
- Zabbix告警发送邮件时附带性能图
脚本处理逻辑分析: 通过zabbix传递给脚本的message参数,筛选出报警信息的itemid; 通过itemid获取到图片并保存; 将报警信息和图片组装成html; 发送邮件. 后续脚本里面的处理 ...
- 爬虫高性能 asyncio库 twisted库 tornado库
一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...