BZOJ3545 Peaks 离线处理+线段树合并
题意:
在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。
分析:
我们把题目中的限制分离出来:
1. 困难值不超过x。
2. 能达到的第k高的山峰。
如果没有限制1,我们对每个连通块建线段树即可,如果没有限制2,我们我们可以选择按照kruskal的思想,按照困难值从小到大加便,离线处理询问。
现在两个限制都在,所以我们考虑使两种算法兼容,所以我们连边时如果两个端点分别属于不同的连通块,我们就合并两个连通块,需要处理的问题是并查集合并和线段树合并。同时离线处理询问即可。
这题还有一个加强版,是强制在线的版本,应该是一道kruskal重构树的练手题。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=;
struct que{int a,b,c,id,ok;}a[N*];
struct seg{int ls,rs,v;}t[N*];
int n,m,q,tot=,nm1[N],nm2[N],fa[N],rt[N],ans[N*];
bool cmp(que a,que b){
return a.c==b.c?a.ok<b.ok:a.c<b.c;
} int get(int x){
return fa[x]==x?x:fa[x]=get(fa[x]);
} void update(int &x,int l,int r,int v){
if(!x) x=++tot;t[x].v=;
if(l==r) return ;int mid=l+r>>;
if(v<=mid) update(t[x].ls,l,mid,v);
else update(t[x].rs,mid+,r,v);
} int query(int x,int l,int r,int p){
if(l==r) return l;int mid=l+r>>;
if(p<=t[t[x].ls].v)
return query(t[x].ls,l,mid,p);
else return
query(t[x].rs,mid+,r,p-t[t[x].ls].v);
} int merge(int x,int y){
if(!x||!y) return x|y;
if(!t[x].ls&&!t[x].rs){
t[x].v+=t[y].v;return x;
} t[x].ls=merge(t[x].ls,t[y].ls);
t[x].rs=merge(t[x].rs,t[y].rs);
t[x].v=t[t[x].ls].v+t[t[x].rs].v;
return x;
} int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++)
scanf("%d",&nm1[i]),
nm2[i]=nm1[i],fa[i]=i;
sort(nm2+,nm2+n+);
for(int i=;i<=n;i++)
nm1[i]=lower_bound(nm2+,nm2++n,nm1[i])-nm2;
for(int i=,x,y,z;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),
a[i]=(que){x,y,z,,};
for(int i=m+,x,y,z;i<=m+q;i++)
scanf("%d%d%d",&x,&y,&z),
a[i]=(que){x,z,y,i-m,};
sort(a+,a++m+q,cmp);
for(int i=;i<=n;i++)
update(rt[i],,n,nm1[i]);
for(int i=;i<=m+q;i++)
if(!a[i].ok){
int x=get(a[i].a),y=get(a[i].b);
if(x!=y) fa[x]=y,
rt[y]=merge(rt[x],rt[y]);
} else{
int x=get(a[i].a);
if(t[rt[x]].v<a[i].b)
ans[a[i].id]=-;
else ans[a[i].id]=
nm2[query(rt[x],,n,t[rt[x]].v-a[i].b+)];
} for(int i=;i<=q;i++)
printf("%d\n",ans[i]);return ;
}
线段树合并
BZOJ3545 Peaks 离线处理+线段树合并的更多相关文章
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- 【线段树合并】bzoj3545: [ONTAK2010]Peaks
1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...
- [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)
传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...
- bzoj3545 Peaks 线段树合并
离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #in ...
- Peaks 线段树合并
Peaks 线段树合并 \(n\)个带权值\(h_i\)山峰,有\(m\)条山峰间双向道路,\(q\)组询问,问从\(v_i\)开始只经过\(h_i\le x\)的路径所能到达的山峰中第\(k\)高的 ...
- BZOJ.3545.[ONTAK2010]Peaks(线段树合并)
题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solut ...
- 线段树合并&&启发式合并笔记
这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...
- BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)
很久以前写过二分答案离线的做法,比较好理解.事实上这还是一个线段树合并+分裂的板子题,相比离线做法以更优的复杂度做了更多的事情.具体不说了.怎么交了一遍luogu上就跑第一了啊 #include< ...
随机推荐
- C# 反射 设置实体属性
C# 反射 设置实体属性 http://blog.csdn.net/cestarme/article/details/6548126 C#反射设置属性值和获取属性值 http://www.cnblog ...
- 关于自增id 你可能还不知道
导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键.本篇文章将以问答的形式讲述关于自增id的一切. 注: 本文所讲的都是基于Innodb存储引 ...
- WPF-DataGrid(数据表格)美化
我们不多哔哔先上图: 数据表格使用背景: 当我们在做二次开发发现我我们的表格无法向WEB的表格一样好看,这时我们就需要对数据表格进行美化和重构 表格美化思维引导: WPF数据表格是由表头和表体(内容) ...
- mqtt遇到的问题锦集
1.无效客户机标识 (2) Connect指令中的KeepAlive有效范围[60秒,300秒],否则会拒绝连接. 2.消息回调出现频繁的断开连接 待解决 3.长时间消息回调出现 已断开连接 (321 ...
- LoadRunner12学习之路(1-5)
本次LoadRunner12学习用户指南,学习周期预计3天,每天学习1-2单元内容! 2017.12.17 一.使用HPE Web Tours示例应用程序 本教程使用 HPE Web Tours(一个 ...
- C#关于html颜色值的转化 ColorTranslator
//颜色转换非常重要快速的转换类. ColorTranslator.FromHtml (); //从html字符串得到颜色 ColorTranslator.ToHtml();
- 45 个非常有用的 Oracle 日期查询语句
日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. SELECT TRUNC (SYSDATE, 'MO ...
- win7电脑删除文件时一直提示文件正在被另一个程序占用
这样的情况并非是第一次遇到了,以前总是会觉得这样的问题只是电脑的错乱,重启一下电脑就好了,但是并非每次都需要重启电脑的,其实简单的设置一下,这个问题就可以解决了.对了,咱们还是说说这到底是个什么问题吧 ...
- es6核心特性-数组扩展
1. Array.from() : 将伪数组对象或可遍历对象转换为真数组 如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,称为伪数组.典型的伪数组有函数的argu ...
- reveal.js让程序员做ppt也享受快乐
前言 程序员除了会写的一手漂亮的代码,也要求做出风格优雅的PPT,诸如向领导汇报工作.向小组成员反馈项目进展自己的工作等等.就本人而言,做ppt还要去找模板,还需要设计风格,内心是焦灼的.于是乎,我搜 ...