●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的双向路径. 接下来 ...
随机推荐
- 冲刺每日报告--Day1
敏捷冲刺每日报告--Day1 情况简介 由于李世钰同学出差了,周六才能回来.所以我们只能先写爬虫,封装代码提供接口等他回来调用. 任务进度 赵坤:编写了基本爬虫代码,目前能在国内有版权的B站.爱奇艺中 ...
- tornado 采用 epoll 代理构建高并发网络模型
1 阻塞和非阻塞 对于阻塞和非阻塞,网上有一个很形象的比喻,就是说好比你在等快递,阻塞模式就是快递如果不到,你就不能做其他事情.非阻塞模式就是在这段时间里面,你可以做其他事情,比如上网.打游戏.睡觉 ...
- JAVA线程概念
一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...
- Syabse数据库无法启动的解决方案
在探讨本问题之前,首先要为大家解释一下Syabse数据库本身.Syabse数据库应用和本身的架构相对而言都相对比较复杂,多数技术人员及公司对Sybase数据库底层结构和运行机制也处于并非完全了解的阶段 ...
- SpringBoot的HelloWorld 应用及解释
参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...
- 阿里云API网关(4)快速入门(开放 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 无用代码清除tip
测试提了个bug过来,说是有个ajax请求报404了. 我一看,后台代码被人删了,问了同事,因为实现机制变了,是应该删,但删多了. 把service和controller都恢复后,一个接口中除了我那个 ...
- Text-文本撤销
#撤销操作 from tkinter import * master = Tk() #打开undo按钮 text=Text(master,width=30,height=5,undo=True) te ...
- 谈谈App的混合开发
一.概念 App混合开发,顾名思义,是一个开发模式,指的是开发一个App一部分功能用native构建一部分功能用html5构建,英文名叫:Hybrid App. 在几年前就已经出现了App混合开发模式 ...
- 计算机网络-TCP之三次握手/四次握手
.概念 .特点 .背景知识补充 .三次握手 .四次握手 .其他补充 1.概念 TCP(Transmission Control Protocol,传输控制协议)是 在不可靠的IP层之上实现的可靠的数据 ...