LightOJ 1128 Greatest Parent
来源:互联网 发布:安阳市网络教育平台 编辑:程序博客网 时间:2024/06/06 17:06
Problem
lightoj.com/login_main.php?url=volume_showproblem.php?problem=1128
vjudge.net/contest/80844#problem/B
Meaning
给一个 n 个点的多叉小顶堆,编号 0 ~ n-1,每个节点都有个编号和值,0 号点为根且值为 1。儿子结点编号、值都严格大于父结点。
每次询问都给出一个结点编号 k 和值 v,求在 k 的祖先结点(包括自己)中值大于等于 k 的编号尽量大的点的编号。
Analysis
因为任意节点到根的路径上的值是单调的,所以其实就是在给出结点到根的路径上二分跳数(从给定结点往上跳几步)。
可以做跟 LCA 一样的预处理,记录深度和祖先信息,在二分跳数时可以比较快地找到跳到的祖先。
Code
#include <cstdio>#include <cstring>using namespace std;const int N = 100000, LOG_N = 17;struct edge{ int to, nxt;} e[N];int head[N], sz;void add_edge(int f, int t){ e[sz].to = t; e[sz].nxt = head[f]; head[f] = sz++;}int pa[N][LOG_N+1], depth[N];void dfs(int now, int fa, int d){ pa[now][0] = fa; depth[now] = d; for(int i = head[now]; ~i; i = e[i].nxt) dfs(e[i].to, now, d + 1);}void init(int n){ dfs(0, -1, 0); for(int k = 0; 1 << k + 1 < n; ++k) for(int v = 0; v < n; ++v) if(pa[v][k] < 0) pa[v][k+1] = -1; else pa[v][k+1] = pa[pa[v][k]][k];}/* 从 v 往上跳 k 步跳到的点 */int ancient(int v, int k){ // 把跳数拆成二进制来跳 // 不用一步步地跳 // 像多重背包的二进制优化 for(int i = 0; k > 0; k >>= 1, ++i) if(k & 1) v = pa[v][i]; return v;}int p[N], s[N];int query(int k, int v){ int l = 0; // 二分跳数 for(int r = depth[k] + 1, m, anc; l + 1 < r; ) { m = l + r >> 1; anc = ancient(k, m); if(s[anc] < v) r = m; else l = m; } return ancient(k, l);}int main(){ p[0] = -1; s[0] = 1; int T; scanf("%d", &T); for(int kase = 1; kase <= T; ++kase) { int n, q; scanf("%d%d", &n, &q); memset(head, -1, sizeof head); sz = 0; for(int i = 1; i < n; ++i) { scanf("%d%d", p+i, s+i); add_edge(p[i], i); } init(n); printf("Case %d:\n", kase); for(int k, v; q--; ) { scanf("%d%d", &k, &v); printf("%d\n", query(k, v)); } } return 0;}
阅读全文
0 0
- LightOJ 1128 Greatest Parent
- Light OJ 1128 - Greatest Parent
- LightOJ1128 Greatest Parent
- BNUOJ 13047 Greatest Parent(要说LCA有点勉强(。・∀・)ノ゙)
- parent
- parent
- Greatest Greatest Common Divisor
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- [LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- LightOJ
- 八、基础教程-数据列(Series)
- ios-主线程
- linux tar.gz zip 解压缩 压缩命令
- 【C语言】排序算法
- RxJava 并发之意外情况处理
- LightOJ 1128 Greatest Parent
- mybaits(3)_使用注解进行增删改查
- 随机抽题考试程序
- Java实现验证码制作
- javabean注意事项之用Integer替换你的int
- poj 2112 最大流求二分图匹配/二分搜索
- 读者写者问题
- The more, The Better HDU
- RabbitMQ系列教程之七:RabbitMQ的 C# 客户端 API 的简介