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< ...
随机推荐
- OC:基础总结
OC面向对象的编程语言思想 类与对象.继承与实例化.属性点语法.内存管理.字符串.可见度. 类是一组具有相同特征和行为的事物的抽象 OC的与C相比所具有的新的特点: 定义新的类.类的实例和方法.方法的 ...
- React VSCode插件
可以安装2个插件,一个是 Atuo Rename Tag 一个 Auto Close Tag 这样就好都了
- Postgresql个人维护库时,出现有用户在连接又找不到这个用户是谁的强制中断连接的方法;
方法一: 去PostgreSQL目录下/data/pgdata/9.4,找到pg_hba.conf, 修改pg_hba.conf的白名单IP (修改前,最好服务已停止,我是这么操作的) # IPv4 ...
- poj 3281 Dining【最大流】
记得把牛拆掉!拆成两个点i和i'在中间连一条流量为1的边,来限制每头牛只能选一组 一般来讲是一种物品一个消费者各占一边,但是这里有两个物品,所以考虑把牛放在中间,s向所有的食物连流量为1的边,所有食物 ...
- 关于浮动与清浮动 float
浮动常见的几种属性值 float {left; right; none; } 主要是定义元素朝哪个方向浮动: 元素浮动后的特性 在一行显示,父级的宽度放不下,自己折行: 支持宽高等样式: 不设置 ...
- layer 确认或取消后跳转
layer.open({ content: "下单成功" , btn: ['确定','取消'], style: 'width:80%', yes: function(index, ...
- HDU 6096 树套树
思路: 网上的题解有AC自动机的,有trie树的,还有(乱搞?)的 首先把输入的那n个串按照字典序排序, 把n个串翻转以后再按照字典序排序 这样我们发现, 查的前缀在字典序排序后是一段区间, 查的后缀 ...
- 题解报告:hdu 1421 搬寝室(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9 ...
- Hibernate3的hbm文件错误引用dtd文件导致项目无法启动问题处理
错误信息: org.hibernate.InvalidMappingException: Could not parse mapping document from resource /***/*** ...
- 16-6 WEB存储-通讯录实战
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...