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大爷题解传送门 说一下感受: 容易发现 ...
随机推荐
- udp/tcp流程
udp: 1.创建套接字 socket 2.绑定本地ip/port bind 3.收发数据 sendto/recvfrom 4.关闭套接字 close tcp客户端: 1.创建套接字 socket 2 ...
- 26)django-form字段和插件widgets
创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 一:常用字段 1.Django中Form类内置字段如下: 用于保存正则表达式 Choice ...
- hexo基本操作
1.新建一篇文章:hexo new post "article title" 2.生成静态网页:hexo g 3.预览效果:hexo s 4.发布:hexo d
- Python目录:
Python基础 python书写规范--消去提示波浪线 Python 列表(list) Python字符串 Python字典 Python文件操作 Python函数 Python函数-装饰器 Pyt ...
- figlet
figlet https://aotu.io/notes/2016/11/22/figlet/ 教程 npm i figlet --save-dev var figlet = require('fi ...
- koa
koa 链接: 官网: https://koa.bootcss.com/# 入门: http://www.ruanyifeng.com/blog/2017/08/koa.html 进阶: https: ...
- c&c++中的宏
1 c&c++中的宏 do {...} while (0); offsetof & container_of 2 引用 [1] do {...} while (0) 在宏定义中的作用 ...
- SQL反模式学习笔记13 使用索引
目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引. 索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...
- 一天带你入门到放弃vue.js(三)
自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...
- 如何写一个Js上传图片插件。
项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下js方面的知识.完成之后效果还不错,当然还要继续优化,源码在最后. 介绍一种常见的js插件的写法 ; ( ...