Description

在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1。

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。

Output

对于每组询问,输出一个整数表示答案。

考虑离线,将边和询问按边权排序,从小到大加入边,平衡树启发式合并维护连通块内点权

#include<cstdio>
#include<algorithm>
#include<cstdlib>
const int M=;
char buf[M+],*ptr=buf-;
inline int _int(){
int x=,c=*++ptr,f=;
while(c>||c<){if(c=='-')f=-;c=*++ptr;}
while(c>&&c<)x=x*+c-,c=*++ptr;
return x;
}
struct edge{
int s,t,l;
}e[];
bool operator<(const edge&a,const edge&b){
return a.l<b.l;
}
struct Q{
int w,mx,k,id;
}qs[];
bool operator<(const Q&a,const Q&b){
return a.mx<b.mx;
}
const int N=;
int n,m,q;
int h[N],ans[];
int ch[N][],sz[N],col[N],rt[N],rnd[N];
int stk[N],stp;
void dfs(int w){
if(!w)return;
dfs(ch[w][]);
stk[stp++]=w;
dfs(ch[w][]);
}
inline void up(int w){
sz[w]=+sz[ch[w][]]+sz[ch[w][]];
}
inline void rot(int&w,int d){
int u=ch[w][d];
ch[w][d]=ch[u][d^];
ch[u][d^]=w;
up(w);
up(w=u);
}
void ins(int&w,int x){
if(!w){
w=x;
return;
}
++sz[w];
int d=(h[w]<h[x]);
ins(ch[w][d],x);
if(rnd[ch[w][d]]>rnd[w])rot(w,d);
}
int kmax(int w,int k){
if(sz[w]<k||k<=)return -;
--k;
while(){
int s=sz[ch[w][]];
if(s==k)return h[w];
if(s<k){
k-=s+;
w=ch[w][];
}else{
w=ch[w][];
}
}
}
void merge(int x,int y){
x=col[x];y=col[y];
if(x==y)return;
if(sz[rt[x]]<sz[rt[y]]){int z=x;x=y;y=z;}
stp=;
dfs(rt[y]);
for(int i=;i<stp;i++){
int w=stk[i];
col[w]=x;
sz[w]=;
ch[w][]=ch[w][]=;
ins(rt[x],w);
}
}
int main(){
fread(buf,,M,stdin);
srand();
n=_int();m=_int();q=_int();
for(int i=;i<=n;i++){
h[i]=_int();
sz[rt[i]=col[i]=i]=;
rnd[i]=rand();
}
for(int i=;i<m;i++){
e[i].s=_int();
e[i].t=_int();
e[i].l=_int();
}
std::sort(e,e+m);
e[m].l=;
for(int i=;i<q;i++){
qs[i].w=_int();
qs[i].mx=_int();
qs[i].k=_int();
qs[i].id=i;
}
std::sort(qs,qs+q);
for(int i=,p=;i<q;i++){
int mx=qs[i].mx;
while(e[p].l<=mx){
merge(e[p].s,e[p].t);
++p;
}
ans[qs[i].id]=kmax(rt[col[qs[i].w]],qs[i].k);
}
for(int i=;i<q;i++)printf("%d\n",ans[i]);
return ;
}

bzoj3545: [ONTAK2010]Peaks的更多相关文章

  1. bzoj3545: [ONTAK2010]Peaks 重构树 主席树

    题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...

  2. BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3545 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

  3. bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版

    题目描述: bzoj3545,luogu bzoj3551 题解: 重构树+线段树合并. 可以算是板子了吧. 代码(非强制在线): #include<cstdio> #include< ...

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

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

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

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

  6. 【BZOJ3545】 [ONTAK2010]Peaks

    BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...

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

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

  8. bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版

    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版 传送门:bzoj  bzoj wdnmd为什么加强版不是权限题原题却是啊 3545: [ONTAK2010]Pe ...

  9. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

随机推荐

  1. 基于Spring框架的Web应用开发笔记 - Outline

    Motivation 最近的工作涉及Web框架搭建,在了解公司原有采用框架基础上对Web开发技术栈做了一次升级,在次做记录. Audience J2EE Web Application Develop ...

  2. 穿越泥地(mud) (BFS)

    问题 C: 穿越泥地(mud) 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 10[提交][状态][讨论版] 题目描述 清早6:00,FJ就离开了他的屋子,开始了他的例行工 ...

  3. Linux驱动设计—— 中断与时钟

    中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...

  4. 获取Android状态栏高度的屡试不爽的方法

    文本转载于:http://blog.csdn.net/yinkai1205/article/details/8638864 如下代码所示: [java] view plaincopy private  ...

  5. shell下的作业管理[转]

    作业管理 举例来说,我们在登陆 bash 后, 想要一边复制文件.一边进行数据搜寻.一边进行编译,还可以一边进行 vi 程序撰写! 当然我们可以重复登陆那六个文字介面的终端机环境中,不过,能不能在一个 ...

  6. 释放Linux系统预留的硬盘空间【转】

    http://www.cnblogs.com/ggjucheng/archive/2012/10/07/2714294.html 前言 大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满 ...

  7. Oracle 12c RAC 搭建手册

    1  共享设备配置 1.1            设备划分说明 冗余策略 卷划分及大小说明 OCRVOTING Ocrvoting01 8G Ocrvoting02 8G Ocrvoting03 8G ...

  8. C#实现图片文件到数据流再到图片文件的转换 --转

    /----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo; ...

  9. 验证码在IE中不刷新

    在IE中,验证码不会刷新而谷歌等其他浏览器没有问题,解决方案就是在验证码的切换地址后面加一个随机的参数 今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓 ...

  10. 023. Asp.net参数化查询预防Sql注入攻击

    /// <summary> /// 参数化查询预防SQL注入式攻击 /// </summary> public int checkLogin(string loginName, ...