●BZOJ 3545 [ONTAK2010]Peaks(离线)
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3545
http://www.lydsy.com/JudgeOnline/problem.php?id=3551(同题,强制在线,题解)
题解:
最小生成树 Kruskal,线段树(合并),离线
首先把询问和边放在一起,按权值大小从小到大排序。
然后对每个点建一棵权值线段树,维护当前联通块里的海拔权值区间内的山的个数
然后按照 Kruskal 算法合并联通块,并且合并两个联通块对应的线段树(Merge操作看代码,感觉很暴力)。
然后对于一个枚举到的询问,其起点所在的联通块里的点一定是可以到达的,
所以就用线段树查询该联通块里的第k高的山就好了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100500
using namespace std;
struct Oper{
int type,w,a,b;
bool operator <(const Oper &rtm) const{
if(w!=rtm.w) return w<rtm.w;
return type<rtm.type;
}
}O[MAXN*10];
struct SGT{
int rt[MAXN],ls[MAXN*50],rs[MAXN*50],cnt[MAXN*50],sz;
void Modify(int &u,int l,int r,int p){
if(!u) u=++sz;
if(l==r){cnt[u]++; return;}
int mid=(l+r)>>1; cnt[u]++;
if(p<=mid) Modify(ls[u],l,mid,p);
else Modify(rs[u],mid+1,r,p);
}
int Merge(int u,int v){
if(!u||!v) return u+v;
cnt[u]+=cnt[v];
ls[u]=Merge(ls[u],ls[v]);
rs[u]=Merge(rs[u],rs[v]);
return u;
}
int Query(int u,int l,int r,int p){
if(l==r) return l;
int mid=(l+r)>>1;
if(p<=cnt[rs[u]]) return Query(rs[u],mid+1,r,p);
else return Query(ls[u],l,mid,p-cnt[rs[u]]);
}
}T;
int Fa[MAXN],H[MAXN],ANS[5*MAXN];
int N,M,Q,Ont;
void read(int &x){
static int f; static char ch;
x=0; f=1; ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-') f=-1; ch=getchar();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
x=x*f;
}
int find(int x){
return x==Fa[x]?x:Fa[x]=find(Fa[x]);
}
int main(){
static int tmp[MAXN],tnt=0;
read(N); read(M); read(Q);
for(int i=1;i<=N;i++)
Fa[i]=i,read(H[i]),tmp[++tnt]=H[i];
for(int i=1;i<=M;i++)
read(O[++Ont].a),read(O[Ont].b),read(O[Ont].w),O[Ont].type=0;
for(int i=1;i<=Q;i++)
read(O[++Ont].a),read(O[Ont].w),read(O[Ont].b),O[Ont].type=i;
sort(tmp+1,tmp+tnt+1); tnt=unique(tmp+1,tmp+tnt+1)-tmp-1;
for(int i=1;i<=N;i++)
H[i]=lower_bound(tmp+1,tmp+tnt+1,H[i])-tmp,
T.Modify(T.rt[i],1,tnt,H[i]);
sort(O+1,O+Ont+1);
for(int i=1,f,fa,fb,p;i<=Ont;i++){
if(O[i].type){
f=find(O[i].a);
if(T.cnt[T.rt[f]]<O[i].b)
ANS[O[i].type]=-1;
else p=T.Query(T.rt[f],1,tnt,O[i].b),ANS[O[i].type]=tmp[p];
}
else{
fa=find(O[i].a); fb=find(O[i].b);
if(fa==fb) continue; Fa[fb]=fa;
T.rt[fa]=T.Merge(T.rt[fa],T.rt[fb]);
}
}
for(int i=1;i<=Q;i++) printf("%d\n",ANS[i]);
return 0;
}
●BZOJ 3545 [ONTAK2010]Peaks(离线)的更多相关文章
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...
- BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay
Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询 ...
- BZOJ.3545.[ONTAK2010]Peaks(线段树合并)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solut ...
- bzoj 3545: [ONTAK2010]Peaks
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1124 Solved: 304[Submit][Status][Discuss] Descripti ...
- bzoj 3545: [ONTAK2010]Peaks Kruskal重构树
题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)
Orz PoPoQQQ 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间. 学到了怎么用指针写可持久化线段树-emmm- CODE 只贴上3551加强版带强制在线的代码 #incl ...
- bzoj 3551: [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
随机推荐
- 点击tableViewCell,调用打电话的功能
对于点击tableViewCell,调用打电话的功能,按照一般的方法,使用Appdelegate的OpenUrl的方法,使用前先使用UIAlertView展示,让用户选择是否拨打,但是发现了个简单的方 ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
- datetimepicker.js 使用笔记
1.官网地址 官网传送门 2.属性及使用示例 2.1调用 html: <input type="text" readonly class="date" ...
- Visual Studio Code初识与自动化构建工具安装
1.Visual Studio Code如何新建文件夹 要自己手动在本地新建,然后再点击文件->打开文件夹即可. 之后你就可以任意添加文件了 2.如何使用自动化构建工具 通过自动化构建工具,用户 ...
- JAVA_SE基础——42.final修饰符
高手勿喷~ final关键字可用于修饰类.变量和方法,它有"这是无法改变的"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特征: 1.fin ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- 电子称DIY(贴应变片+写代码)
第一步.应变片介绍 ---------------------------------------------------------------------------------------- ...
- LeetCode & Q53-Maximum Subarray-Easy & 动态规划思路分析
Array DP Divide and Conquer Description: Find the contiguous subarray within an array (containing at ...
- 第一次制作和使用图标字体-IcoMoon
开题:之前就有所耳闻,最近两天第一次运用到图标字体.刚开始嘛,一脸懵逼的状态.成功运用之后就来记录一下使用过程咯! 1. 打开在线生成工具:https://icomoon.io/app/#/selec ...
- Angular 学习笔记 (路由外传 - RouteReuseStrategy)
refer : https://github.com/angular/angular/issues/10929 https://stackoverflow.com/questions/41280471 ...