题目链接:洛谷


看到“只经过困难值小于等于$x$的路径”。

感觉有点眼熟。

ow,就是[NOI2018]归程。


和那道题一样,可以直接建出Kruskal重构树,每次倍增寻找祖先中最上面的不大于$x$的节点$v$,$v$的子树就是可以到达的范围。

根据Kruskal重构树的dfs序建出主席树求第$K$大。

 #include<cstdio>
#include<algorithm>
#define Rint register int
using namespace std;
const int N = ;
struct Edge {
int u, v, w;
inline bool operator < (const Edge &o) const {return w < o.w;}
} e[N];
int n, m, q, _n, h[N], b[N], val[N], head[N], to[N << ], nxt[N << ], fa[N], tot;
inline int getfa(int x){return x == fa[x] ? x : fa[x] = getfa(fa[x]);}
inline void add(int a, int b){
static int cnt = ;
to[++ cnt] = b; nxt[cnt] = head[a]; head[a] = cnt;
}
int root[N], ls[N << ], rs[N << ], seg[N << ], cnt;
inline void change(int &now, int pre, int L, int R, int pos){
now = ++ cnt; seg[now] = seg[pre] + ;
if(L == R) return;
int mid = L + R >> ;
if(pos <= mid) rs[now] = rs[pre], change(ls[now], ls[pre], L, mid, pos);
else ls[now] = ls[pre], change(rs[now], rs[pre], mid + , R, pos);
}
inline int query(int nowl, int nowr, int L, int R, int k){
if(L == R) return L;
int mid = L + R >> , minused = seg[rs[nowr]] - seg[rs[nowl]];
if(k <= minused) return query(rs[nowl], rs[nowr], mid + , R, k);
else return query(ls[nowl], ls[nowr], L, mid, k - minused);
}
int st[][N], dfn[N], out[N], tim;
inline void dfs(int x){
dfn[x] = ++ tim;
if(x <= n) change(root[dfn[x]], root[dfn[x] - ], , _n, h[x]);
else root[dfn[x]] = root[dfn[x] - ];
for(Rint i = head[x];i;i = nxt[i]) dfs(to[i]);
out[x] = tim;
}
inline int query(int v, int x, int k){
for(Rint i = ;~i;i --)
if(st[i][v] && val[st[i][v]] <= x) v = st[i][v];
int lx = root[dfn[v] - ], rx = root[out[v]];
return seg[rx] - seg[lx] >= k ? b[query(lx, rx, , _n, k)] : -;
}
int main(){
scanf("%d%d%d", &n, &m, &q); tot = n;
for(Rint i = ;i <= n;i ++) scanf("%d", h + i), b[i] = h[i];
sort(b + , b + n + );
_n = unique(b + , b + n + ) - b - ;
for(Rint i = ;i <= n;i ++) h[i] = lower_bound(b + , b + _n + , h[i]) - b;
for(Rint i = ;i <= m;i ++)
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
sort(e + , e + m + );
for(Rint i = ;i <= n;i ++) fa[i] = i;
for(Rint i = ;i <= m && tot < (n << ) - ;i ++){
int fa1 = getfa(e[i].u), fa2 = getfa(e[i].v);
if(fa1 != fa2){
++ tot;
fa[tot] = fa[fa1] = fa[fa2] = tot;
st[][fa1] = st[][fa2] = tot;
add(tot, fa1); add(tot, fa2);
val[tot] = e[i].w;
}
}
for(Rint i = tot;i;i --) if(!dfn[i]) dfs(i);
for(Rint i = ;i <= ;i ++)
for(Rint j = ;j <= tot;j ++) st[i][j] = st[i - ][st[i - ][j]];
while(q --){
int v, x, k;
scanf("%d%d%d", &v, &x, &k);
printf("%d\n", query(v, x, k));
}
}

Luogu4197

Luogu4197 Peaks的更多相关文章

  1. luogu4197 Peaks (kruskal重构树+主席树)

    按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...

  2. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  3. *[codility]Peaks

    https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...

  4. Clustering by density peaks and distance

    这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...

  5. Science论文"Clustering by fast search and find of density peaks"学习笔记

    "Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...

  6. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

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

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

  8. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

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

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

随机推荐

  1. 【转】Java中文乱码的解决

    在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...

  2. .Net Core---- 通过EPPlus批量导出

    前台代码: 前台代码是在.net core bootstrap集成框架上的(这是效果浏览地址:http://core.jucheap.com[效果地址来自:http://blog.csdn.net/a ...

  3. [C]\x字符转义序列

    概述       \x转义的定义是这样的 转义符 字符值 输出结果 \xh[h...] 具有此十六进制码的字符 输出此字符 问题      看似\x后面可以接受1或n个十六进制的字符,但是如果你把一个 ...

  4. 阿里云centos7成功安装和启动nginx,但是外网访问不了的解决方案

    问题环境: 阿里云centos7.4.1708 问题描述:成功配置,启动成功,外网访问不了 解决方案: 经过查阅文档,去阿里云后台查看,原来是新购的服务器都加入和实例安全组. (OMG)立即去配置.加 ...

  5. beta冲刺6/7

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...

  6. python全栈开发day102-django rest-framework框架

    1.频次访问组件 1) 手写版本 # class VisitThrottle(BaseThrottle): # # def __init__(self): # self.history = None ...

  7. WPF中的逻辑树和可视化树

    WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...

  8. nginx+vsftp图片下载java代码上传

    系统环境:阿里云centos7.3 安装nginx 查看nginx进程 ps aux|grep nginx 在/usr/local/nginx/sbin/目录下 nginx启动 ./nginx 快速停 ...

  9. asp.net 页面生命周期事件详细

    (1)请求页面:页请求发生在页生命周期开始之前. (2)开始:在开始阶段,将设置页属性,如Request和Response.在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性 ...

  10. java自动化-junit框架简述

    本人使用的是java的junit框架来组织的自动化测试,故我这边需要简单介绍一下junit框架 首先,建议自行百度一下junit框架,先有一个大概的了解 所谓的接口自动化测试,会对多个接口中每一个接口 ...