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

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

有小于等于 $x$ 这个条件十分不好办 .

考虑离线,按照 $x$ 从小到大依次加入,查询的时候直接在 $splay$ 中查询第 $k$ 大即可.

#include <cstdio>
#include <algorithm>
#include <stack>
#define N 600005
#define inf 1000000002
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
int splay_cnt;
namespace IO
{
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd()
{
int x=0;
char c=nc();
while(c<48) c=nc();
while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc();
return x;
}
};
struct Edge
{
int u , v , c ;
}ed[N];
bool cmp(Edge a, Edge b)
{
return a.c < b.c;
}
struct Ask
{
int u , x , k , id ;
}as[N];
bool cmp2(Ask a, Ask b)
{
return a.x < b.x;
}
#define lson ch[x][0]
#define rson ch[x][1]
stack <int> S;
int answer[N], h[N], size[N], f[N], ch[N][2], siz[N], val[N], rt[N], p[N], mk = 0;
inline void init(int sz)
{
for(int i = 1; i <= sz ; ++i) S.push(i);
for(int i = 1; i <= sz ; ++i) p[i] = i, size[i] = 1;
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
inline int newnode()
{
int u = S.top(); S.pop();
return u;
}
inline int get(int x)
{
return ch[f[x]][1] == x;
}
inline void pushup(int x)
{
siz[x] = siz[lson] + siz[rson] + 1;
}
inline void rotate(int x)
{
int old = f[x], fold = f[old], which = get(x);
ch[old][which] = ch[x][which ^ 1], f[ch[old][which]] = old;
ch[x][which ^ 1] = old, f[old] = x, f[x] = fold;
if(fold) ch[fold][ch[fold][1] == old] = x;
pushup(old), pushup(x);
}
inline void splay(int x, int &tar)
{
int u = f[tar];
for(int fa; (fa = f[x]) ^ u; rotate(x))
if(f[fa] ^ u)
rotate(get(fa) == get(x) ? fa : x);
tar = x;
}
inline int kth(int x, int k)
{
if(siz[x] < k) return inf;
while(1)
{
if(k > siz[rson])
{
k -= (siz[rson] + 1);
if(!k) return x;
else x = lson;
}
else x = rson;
}
}
inline void insert(int &x, int ff, int v)
{
if(!x)
{
mk = x = newnode();
f[x] = ff, val[x] = v, pushup(x);
return;
}
insert(ch[x][v > val[x]], x, v), pushup(x);
}
inline void DFS(int y, int x)
{
if(lson) DFS(y, lson);
if(rson) DFS(y, rson);
int v = val[x];
S.push(x), val[x] = siz[x] = lson = rson = f[x] = 0, insert(rt[y], 0, v), ++splay_cnt;
if(splay_cnt % 6 == 0) splay(mk, rt[y]);
}
inline void connect(int o)
{
int u = ed[o].u, v = ed[o].v;
int x = find(u), y = find(v);
if(x ^ y)
{
if(size[y] < size[x]) swap(x, y);
p[x] = y, size[y] += size[x], DFS(y, rt[x]);
}
}
int main()
{
using namespace IO;
// setIO("input");
int n, m, q, i, j;
n = rd(), m = rd(), q = rd(), init(n);
for(i = 1; i <= n ; ++i) h[i] = rd(), insert(rt[i], 0, h[i]);
for(i = 1; i <= m ; ++i) ed[i].u = rd(), ed[i].v = rd(), ed[i].c = rd();
sort(ed + 1, ed + 1 + m, cmp);
for(i = 1; i <= q ; ++i)
{
as[i].u = rd(), as[i].x = rd(), as[i].k = rd(), as[i].id = i;
}
sort(as + 1, as + 1 + q, cmp2);
for(i = j = 1; i <= q; ++i)
{
while(ed[j].c <= as[i].x && j <= m) connect(j), ++j;
int l = kth(rt[find(as[i].u)], as[i].k);
answer[as[i].id] = (l == inf ? inf : val[l]);
if(l ^ inf)
{
++splay_cnt;
if(splay_cnt % 6 == 0) splay(l, rt[find(as[i].u)]);
}
}
for(i = 1; i <= q; ++i) printf("%d\n",answer[i] == inf ? -1 : answer[i]);
return 0;
}

  

BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay的更多相关文章

  1. BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]

    3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...

  2. BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )

    这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...

  3. ●BZOJ 3545 [ONTAK2010]Peaks(离线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3545 http://www.lydsy.com/JudgeOnline/problem.ph ...

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

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

  5. bzoj 3545: [ONTAK2010]Peaks

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Descripti ...

  6. bzoj 3545: [ONTAK2010]Peaks Kruskal重构树

    题目: 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只经 ...

  7. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  8. BZOJ.3510.首都(LCT 启发式合并 树的重心)

    题目链接 BZOJ 洛谷 详见这. 求所有点到某个点距离和最短,即求树的重心.考虑如何动态维护. 两棵子树合并后的重心一定在两棵树的重心之间那条链上,所以在合并的时候用启发式合并,每合并一个点检查sz ...

  9. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

随机推荐

  1. kettle 连接 mysql8.0 报错的解决办法 org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Error connecting to database: (using class org.gjt.mm.mysql.

    1.下载 mysql8.0 驱动放到 如下目录中 mysql8.0以上的驱动下载链接:mysql-connet-8.0.13 2.配置你连接的数据库 找到如下文件打开编辑 连接信息:下面是我本地的配置 ...

  2. Akka系列(五):Java和Scala中的Future

    前言....... 随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue ...

  3. mybatis多对多级联查询

    1.实体 package com.govmade.govdata.modules.sys.pojo; import java.util.List; import javax.persistence.T ...

  4. 【6.18校内test】T3细胞分裂

    尽管T1T2很简单,但还是阻止不了我T3wa一片 细胞分裂[题目链接] xcg同学有一个80pts的代码 他说他的代码和我的很像,可惜我比较笨,只有30pts 其实这道题考场上是想到要分解质因数了,然 ...

  5. 洛谷 P1508 Likecloud 题解

    题面 很简单的一个二维DP f[i][j]表示最后吃到(i,j)所能获得的最大值, 那么f[i][j]=max(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]; ...

  6. Luogu P4095 [HEOI2013]Eden的新背包问题

    题目 求出从前往后的背包\(f_{i,j}\)和从后往前的背包\(F_{i,j}\). 那么对于询问\((d,e)\),答案就是\(\max\limits_{i=0}^e f_{d-1,i}+F_{d ...

  7. python,pycharm环境安装

    1.1 python3安装四部曲 第一步下载 地址 https://www.python.org/downloads/windows/ 第二步安装 1. 第三步 配置坏境变量 第四步 测试是否完成安装 ...

  8. 解决IOS把数字渲染为电话号码,颜色为蓝色解决方案

    可将telephone=no,则手机号码不被显示为拨号链接<meta name="format-detection" content="telephone=no&q ...

  9. jackson json序列化 首字母大写 第二个字母需小写

    有这样一个类: @Setter @Getter @JsonNaming(value = PropertyNamingStrategy.UpperCamelCaseStrategy.class) pub ...

  10. static修饰的成员与非static修饰类的成员的区别

    ① 格式 : 1> static修饰的,称为静态成员,非static修饰的,称为非静态成员. ② 内存位置: 1>static修饰的,在方法区的静态区中,非static修饰的,在堆中的对象 ...