BZOJ3545:[ONTAK2010]Peaks
浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=3545
离线,按照权值排序之后就跟[HNOI2012]永无乡一样了。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(nlogn)\)
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e5+5,maxm=5e5+5;
int n,m,Q,cnt;
int tmp[maxn],h[maxn];
int fa[maxn],rt[maxn],ans[maxm];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct edge {
int a,b,v;
bool operator<(const edge &a)const {
return v<a.v;
}
}e[maxm];
struct Query {
int u,rk,limit,id;
bool operator<(const Query &a)const {
return limit<a.limit;
}
}q[maxm];
int find(int x) {
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
struct segment_tree {
int tot;
int sum[maxn*20],ls[maxn*20],rs[maxn*20];
void change(int &p,int l,int r,int pos) {
p=++tot,sum[p]=1;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)change(ls[p],l,mid,pos);
else change(rs[p],mid+1,r,pos);
}
int merge(int a,int b) {
if(!a||!b)return a+b;
if(!ls[a]&&!rs[a]&&!ls[b]&&!rs[b]) {
sum[a]+=sum[b];return a;
}
ls[a]=merge(ls[a],ls[b]);
rs[a]=merge(rs[a],rs[b]);
sum[a]=sum[ls[a]]+sum[rs[a]];
return a;
}
int query(int p,int l,int r,int rk) {
if(l==r)return l;
int mid=(l+r)>>1;
if(sum[rs[p]]>=rk)return query(rs[p],mid+1,r,rk);
else return query(ls[p],l,mid,rk-sum[rs[p]]);
}
}T;
int main() {
n=read(),m=read(),Q=read();
for(int i=1;i<=n;i++)
tmp[i]=h[i]=read();
sort(tmp+1,tmp+n+1);
cnt=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++)
h[i]=lower_bound(tmp+1,tmp+cnt+1,h[i])-tmp;
for(int i=1;i<=m;i++)
e[i].a=read(),e[i].b=read(),e[i].v=read();
for(int i=1;i<=Q;i++)
q[i].u=read(),q[i].limit=read(),q[i].rk=read(),q[i].id=i;
sort(e+1,e+m+1),sort(q+1,q+Q+1);
for(int i=1;i<=n;i++)
fa[i]=i,T.change(rt[i],1,cnt,h[i]);
int st=1;
for(int i=1;i<=Q;i++) {
while(st<=m&&e[st].v<=q[i].limit) {
int a=find(e[st].a),b=find(e[st].b);
if(a!=b)fa[a]=b,rt[b]=T.merge(rt[b],rt[a]);st++;
}
int u=find(q[i].u);
if(T.sum[rt[u]]<q[i].rk)ans[q[i].id]=-1;
else ans[q[i].id]=tmp[T.query(rt[u],1,cnt,q[i].rk)];
}
for(int i=1;i<=Q;i++)
printf("%d\n",ans[i]);
return 0;
}
BZOJ3545:[ONTAK2010]Peaks的更多相关文章
- bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 【BZOJ3545】 [ONTAK2010]Peaks
BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树
[BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...
- bzoj3545: [ONTAK2010]Peaks 重构树 主席树
题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- [ONTAK2010]Peaks kruskal重构树,主席树
[ONTAK2010]Peaks kruskal重构树练手题. LG传送门竟然不强制在线?看到离线水过很不爽:B站强制在线版传送门 看到"询问从点\(v\)开始只经过困难值小于等于\(x\) ...
随机推荐
- 记录-spring MultipartFile 文件上传
注意:以下上传和下载方法未必完全正确,不同浏览器效果不同,建议不要使用IE /** * 简单的文件上传 * @author:qiuchen * @createTime:2012-6-19 * @par ...
- iOS GPUImage 滤镜介绍
这里直接引用官方描述: The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated ...
- Generally a good method to avoid this is to randomly shuffle the data prior to each epoch of training.
http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/
- 洛谷 4035 [JSOI2008]球形空间产生器
题目戳这里 一句话题意 给你 n+1 个 n 维点,需要你求出这个n维球的球心.(n<=10) Solution 这个题目N维的话确实不好想,反正三维就已经把我搞懵了,所以只好拿二维类比. 首先 ...
- HDU 4772 Zhuge Liang's Password (简单模拟题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4772 题面: Zhuge Liang's Password Time Limit: 2000/1000 ...
- go语言之并发编程一
Go语言最大的优势就在于并发编程.Go语言的关键字go就是开启并发编程也就是goroutine的唯一途径.一条go语句以为着一个函数或方法的并发执行.Go语句是由go关键字和表达式组成.比如下面的这种 ...
- linux c编程:非阻塞I/O
通常来说,从普通文件读数据,无论你是采用 fscanf,fgets 也好,read 也好,一定会在有限的时间内返回.但是如果你从设备,比如终端(标准输入设备)读数据,只要没有遇到换行符(‘\n’),r ...
- Linux与Windows编译器的区别
移植工作開始后的第一步就是在目标平台Linux上进行编译,并链接源码.因为须要移植的软件通常并未在Linux平台上编译过,编译的过程可能会遇到非常大的困难.普通情况下,由类型声明引起的编译错误是比較e ...
- shell编程1
shell编程1 一.shell基础正则表达式 1.正则表达式和通配符 正则表达式是用来在文件中匹配符合条件的字符串,正则式包含匹配.(grep awk sed) 通配符是用来匹配符合条件的文件名,通 ...
- Android AbsoluteLayout绝对布局
绝对布局也叫坐标布局,指定元素的绝对位置,因为适应性很差,一般很少用到.可以使用RelativeLayout替代. 常用属性: android:layout_x --------组件x坐标 andro ...