Luogu4197 Peaks
题目链接:洛谷
看到“只经过困难值小于等于$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的更多相关文章
- luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- *[codility]Peaks
https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...
- Clustering by density peaks and distance
这次介绍的是Alex和Alessandro于2014年发表在的Science上的一篇关于聚类的文章[13],该文章的基本思想很简单,但是其聚类效果却兼具了谱聚类(Spectral Clustering ...
- Science论文"Clustering by fast search and find of density peaks"学习笔记
"Clustering by fast search and find of density peaks"是今年6月份在<Science>期刊上发表的的一篇论文,论文中 ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- bzoj 3551: [ONTAK2010]Peaks加强版
Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
随机推荐
- FM算法(二):工程实现
主要内容: 实现方法 Python实现FM算法 libFM 一.实现方法 1.FM模型函数 变换为线性复杂度的计算公式: 2.FM优化目标 根据不同的应用,FM可以采用不同的损失函数loss fu ...
- laravel whereDoesntHave
select * from `feeds` where not exists (select * from `black_lists` where `feeds`.`user_id` = `black ...
- SQL入门(1): 创建/查询/更新/连接/视图/SSMS简介
本文介绍SQL的基本查询语句 (1) select... from * 表示全部, 选择的东西还可以进行简单的运算, 可以列别名 select * from student; -sage from ...
- SpringMVC的入门示例
1.配置流程说明 第一步:导入包 第二步:构建一个请求,编写请求页面 第三步:配置核心控制器 第四步:构建一个业务控制器 第五步:编写Spring配置文件 第六步:编写一个返回页面 2.配置流程--- ...
- 微信支付的安全漏洞之XXE
1.场景:国外安全社区公布微信支付官方SDK存在严重漏洞,可导致商家服务器被入侵(绕过支付的效果).目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大(已确认陌陌.vivo因使用该SDK而存在该漏洞 ...
- James Munkres Topology: Sec 18 Exer 12
Theorem 18.4 in James Munkres “Topology” states that if a function \(f : A \rightarrow X \times Y\) ...
- PyCharm 怎么查看 Python 的变量类型和变量内容
一.在程序的某一行添加断点 二.选择 debug 程序
- bool值的底层应用场景
这里我们的if 或者while,还有and,or,not 等都是在内部调用一个对象的bool方法,然后返回True或者是False, a = [0, ] # a = [] # print(bool(a ...
- ARC 103
目录 官方题解 C 官方题解 C 这道题教会了我怎样正确统计众数和第二众数........... 我之前的方法是错的 #include <bits/stdc++.h> using name ...
- Ackerman
Ackerman 递归算法 一 . 问题描述及分析 图1 二 . 代码实现 package other; import java.io.BufferedWriter; import java.io.F ...