#3551. [ONTAK2010]Peaks加强版

我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。

考虑按照边权升序,建议kruskalkruskalkruskal重构树,然后倍增向上跳,找到困难值小于等于xxx的深度最小的节点uuu,

那么我们只要在uuu的子树中询问第kkk大即可,所以可以用主席树来写,依照dfsdfsdfs序,对每个节点建立一颗主席树,然后在主席树上查找第kkk大即可。

#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10;int head[N], to[N], nex[N], cnt = 1;int n, m, q, nn, a[N], ff[N], value[N], h[N];int fa[N][21], l[N], r[N], rk[N], tot;int root[N], ls[N << 7], rs[N << 7], sum[N << 7], num;struct Res {int u, v, w;bool operator < (const Res &t) const {return w < t.w;}
}edge[N];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void update(int &rt, int pre, int l, int r, int x, int v) {rt = ++num;ls[rt] = ls[pre], rs[rt] = rs[pre], sum[rt] = sum[pre] + v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], ls[pre], l, mid, x, v);}else {update(rs[rt], rs[pre], mid + 1, r, x, v);}
}int query(int L, int R, int l, int r, int k) {if (l == r) {return l;}int res = sum[ls[R]] - sum[ls[L]], mid = l + r >> 1;if (res >= k) {return query(ls[L], ls[R], l, mid, k);}else {return query(rs[L], rs[R], mid + 1, r, k - res);}
}int find(int rt) {return rt == ff[rt] ? rt : ff[rt] = find(ff[rt]);
}void dfs(int rt, int f) {fa[rt][0] = f, l[rt] = ++tot, rk[tot] = rt;for (int i = 1; i <= 20; i++) {fa[rt][i] = fa[fa[rt][i - 1]][i - 1];}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs(to[i], rt);}r[rt] = tot;
}void kruskal() {for (int i = 1; i < N; i++) {ff[i] = i;}sort(edge + 1, edge + 1 + m);for (int i = 1, cur = 1; i <= m && cur < n; i++) {int u = find(edge[i].u), v = find(edge[i].v);if (u != v) {cur++, nn++;ff[u] = nn, ff[v] = nn;value[nn] = edge[i].w;add(nn, u), add(nn, v);if (u <= n) {value[u] = edge[i].w;}if (v <= n) {value[v] = edge[i].w;}}}dfs(nn, 0);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d %d", &n, &m, &q);for (int i = 1; i <= n; i++) {scanf("%d", &h[i]);a[i] = h[i];}nn = n;for (int i = 1; i <= m; i++) {scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);}kruskal();int maxn = n;sort(a + 1, a + 1 + maxn);maxn = unique(a + 1, a + 1 + maxn) - (a + 1);for (int i = 1; i <= n; i++) {h[i] = lower_bound(a + 1, a + 1 + maxn, h[i]) - a; }for (int i = 1; i <= nn; i++) {root[i] = root[i - 1];if (rk[i] <= n) {update(root[i], root[i], 1, maxn, h[rk[i]], 1);}}for (int i = 1, u, x, k, last_ans = 0, res; i <= q; i++) {scanf("%d %d %d", &u, &x, &k);if (last_ans != -1) {u ^= last_ans, x ^= last_ans, k ^= last_ans;}for (int j = 20; j >= 0; j--) {if (fa[u][j] && value[fa[u][j]] <= x) {u = fa[u][j];}}res = sum[root[r[u]]] - sum[root[l[u] - 1]];last_ans = res < k ? -1 : a[query(root[l[u] - 1], root[r[u]], 1, maxn, res - k + 1)];printf("%d\n", last_ans);}return 0;
}

#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)相关推荐

  1. bzoj3551 [ONTAK2010]Peaks加强版 kruskal重构树

    最大边最小,就是最小生成树,可以考虑用主席树维护father数组,但不能遍历子集查找 然后就只能牺牲一部分空间时间来多存一些东西 多存的就是边值大小顺序,本来以为是用主席树排边值,结果由于此题有2种数 ...

  2. [ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)

    Peaks description solution code description 在Bytemountains有N座山峰,每座山峰有他的高度h_i 有些山峰之间有双向道路相连,共M条路径,每条路 ...

  3. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  4. Peaks加强版 黑暗爆炸 - 3551 Kruskal重构树 + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你一张图,有nnn个山峰,每个山峰高度为hih_ihi​,有mmm条边,每条边有个难度值wiw_iwi​,现在有qqq个询问,每次询问给定一个山峰vvv,问 ...

  5. P4197-Peaks【Kruskal重构树,主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4197 题目大意 nnn个点的一张无向图,每个点有一个hih_ihi​,边有权值. qqq次询问从vvv出发不走权 ...

  6. P4899-[IOI2018]werewolf 狼人【Kruskal重构树,主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4899 题目大意 nnn个点的一张无向图,每次询问(s,t,l,r)(s,t,l,r)(s,t,l,r)表示询问能 ...

  7. P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)

    P4899 [IOI2018] werewolf 狼人 给定一个有nnn个点mmm条边的无向图,有QQQ个询问 每次输入S,E,L,RS, E, L, RS,E,L,R,表示你在SSS点出发,要到EE ...

  8. 牛客 - 牛半仙的妹子图(并查集+bitset/克鲁斯卡尔重构树+主席树)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的连通图,每个点都有一种颜色,每条边都有一个权值,现在规定一个起点 st,再给出 q 次询问,每次询问给出区间 [ l , r ] , ...

  9. BZOJ.3551. [ONTAK2010]Peaks加强版

    传送门 类似可以离线处理的题目Peaks KruskalKruskalKruskal重构树 强制在线,主要就考一个[重构树]以及[树链剖分]+[静态区间第K大],离散化建立一颗权值线段树即可 重构树的 ...

最新文章

  1. 通过Corosync实现Mysql高可用,以及LVS+ldirectord高可用并状态检测
  2. 代码:android崩溃日志收集和处理
  3. Scala入门到精通——第二十四节 高级类型 (三)
  4. 【安全牛学习笔记】思路、身份认证方法、密码破解方法、字典
  5. Myeclipse中Tomcat的两种部署方式
  6. 2019-03-09-算法-进化(从排序数组中删除重复项)
  7. python环境变量的配置 alias_配置别名
  8. 字符串输出为什么第一个没了_「课堂笔记」Python基础语法:变量和输入输出
  9. __attribute__((visibility()))
  10. 中set无效是怎么回事_静态时序分析圣经翻译计划——第十章:鲁棒性检查 (中)...
  11. cocos2d-x学习之添加显示文字
  12. Python小游戏--贪吃蛇
  13. 口令破解(概述、暴力破解、字典破解、Hydra)
  14. win7 exfat补丁_U盘重装win7系统后必不可少的几大优化
  15. K2P加USB口刷入Padavan
  16. Android Studio 导入安卓源码步骤
  17. cpu虚拟化(cpu虚拟化开启有什么影响)
  18. 关于成立一个软件工作室
  19. 微商怎么找客源,新手做微商如何找客源的
  20. [20190718]12c rman新特性 表恢复.txt

热门文章

  1. php html标签自定义属性,详解H5的自定义属性data-*
  2. 浙大计算机系可以转专业吗,求教。。浙大转专业容易吗
  3. 基于小波变换的信号降噪处理及仿真研究_信号处理方法推荐--1(转载自用,侵删)...
  4. 中国的四大沙地,你都认识吗?
  5. 越绿自己,就会越强?
  6. get到一个生气后的牵手方式!太可爱了
  7. 深度学习会不会被取代?深度学习必看发展史
  8. 你知道长颈鹿是怎么睡觉的吗? | 今日趣图
  9. 造作吧,Python快速入门!
  10. ssh长时间不操作便断开_连接SSH长时间不操作断开解决办法