题意:

  在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 离线处理+线段树合并的更多相关文章

  1. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  2. 【bzoj3545】[ONTAK2010]Peaks 线段树合并

    [bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...

  3. 【线段树合并】bzoj3545: [ONTAK2010]Peaks

    1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...

  4. [BZOJ3545] [ONTAK2010]Peaks(线段树合并 + 离散化)

    传送门 由于困难值小于等于x这个很恶心,可以离线处理,将边权,和询问时的x排序. 每到一个询问的时候,将边权小于等于x的都合并起来再询问. .. 有重复元素的线段树合并的时间复杂度是nlog^2n # ...

  5. bzoj3545 Peaks 线段树合并

    离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #in ...

  6. Peaks 线段树合并

    Peaks 线段树合并 \(n\)个带权值\(h_i\)山峰,有\(m\)条山峰间双向道路,\(q\)组询问,问从\(v_i\)开始只经过\(h_i\le x\)的路径所能到达的山峰中第\(k\)高的 ...

  7. BZOJ.3545.[ONTAK2010]Peaks(线段树合并)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. \(Solut ...

  8. 线段树合并&&启发式合并笔记

    这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...

  9. BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)

    很久以前写过二分答案离线的做法,比较好理解.事实上这还是一个线段树合并+分裂的板子题,相比离线做法以更优的复杂度做了更多的事情.具体不说了.怎么交了一遍luogu上就跑第一了啊 #include< ...

随机推荐

  1. 1.Ext.onReady详解

    转自:https://blog.csdn.net/xufang461010923/article/details/37660139 我们知道,只有在Ext框架全部加载完后才能在客户端的代码中使用Ext ...

  2. 金融事业部QA培训体系

    此文已由作者夏君授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 引言     总结2015,放眼2016,纵观整个互联网圈,人才依然是业务成功的第一要素,在网易,我想也是这样 ...

  3. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  4. PHP arrray_filter(), array_map()区别与应用

    array_filter()用回调函数过滤数组中的元素.依次将数组中的元素传递给回调函数,如果回调函数返回true,则被过滤的元素作为返回数组的元素,并最终一起返回.数组的键名保持不变.array_m ...

  5. JavaScript--DOM创建元素节点createElement

    创建元素节点createElement createElement()方法可创建元素节点.此方法可返回一个 Element 对象. 语法: document.createElement(tagName ...

  6. 洛谷 P1816 忠诚

    https://www.luogu.org/problemnew/show/1816 st表模板 #include<cstdio> #include<algorithm> us ...

  7. this关键字的构造方法的使用

    package com.wh.Object3; public class this_Demo { private String name; private double price; private ...

  8. Webform 三级联动例子

    首先分别做三个下拉列表 <body> <form id="form1" runat="server"> <asp:DropDown ...

  9. vue组件中—bus总线事件回调函数多次执行的问题

    在利用vue组件进行事件监听时发现,如果对N个vue组件实例的bus总线绑定同一事件的回调函数,触发任意组件的对应事件,回调函数至少会被执行N次,这是为什么呢? 为此,调研了普通对象的事件绑定和触发实 ...

  10. SugarCRM安装踩雷(一)

    安装SugarCRM前置条件: 1.找对平台.正确版本的安装包 2.APACHE + MYSQL + TOMCAT环境先确保OK 坑1: 进入安装参数设置步骤的MYSQL用户密码——这里根据Mysql ...