Greatest Parents Ligh OJ1128
来源:互联网 发布:励志情侣走红网络 编辑:程序博客网 时间:2024/05/21 06:58
其实倍增可以”缩”
题意:
一棵树的点权会给你,每一次询问一个x,y 问在x的祖先之中(包括x) 权值 >=y的而且是离x最远的点的编号!
思路
核心的什么也不说了,只是希望说一说这个:
每一次倍增,dp[i][j]~dp[i][0]其实就是相当于是一个二分搜索的过程呢!
比如dp[i][3]会符合答案,那么i就会自动”跳”到 i+2^3的地方,继续在(i+2^3)的地方2^2
一直下去,于是就有了答案!
代码:
#pragma GCC optimize(3)#include <bits/stdc++.h>#define N 100005#define M 20using namespace std;int T, n, m, x, y, val[N]={1}, fa[N][M], dp[N][M];vector<int> G[N];void DFS(int now){ for (int i = 0; i < G[now].size(); i++) { int v = G[now][i]; fa[v][0] = now, dp[v][0] = val[v]; for (int j = 1; j < M; j++) fa[v][j] = fa[fa[v][j - 1]][j - 1]; for (int j = 1; j < M; j++) dp[v][j] = max(dp[v][j - 1], dp[fa[v][j - 1]][j - 1]); DFS(v); }}inline int solve(int x, int y){ for (int i = M-1; i >= 0; i--) if (dp[fa[x][i]][i] >= y) x = fa[x][i]; return x;}int main(){ scanf("%d", &T); for (int loc = 1; loc <= T; loc++) { scanf("%d%d", &n, &m); for (int i = 0; i <= n; i++) G[i].clear(), fa[0][i] = 0, dp[0][i] = 1; for (int i = 1; i < n; i++) { scanf("%d%d", &x, &val[i]); G[x].push_back(i); } DFS(0); printf("Case %d:\n", loc); for (int i = 1; i <= m; i++) { scanf("%d%d", &x, &y); printf("%d\n", solve(x, y)); } } return 0;}
阅读全文
1 0
- Greatest Parents Ligh OJ1128
- parents
- Being parents
- parents()用法
- Greatest Greatest Common Divisor
- ligh oj 1004 - Monkey Banana Problem
- greatest用法
- GREATEST LEAST
- Greatest Number
- Greatest Number
- Greatest Number
- Greatest Number
- Greatest Number
- Greatest Number
- LEAST() GREATEST()
- Greatest Greatest Common Divisor HD5207
- jquery的parents()和parents的比较
- To My Parents
- Excel中多个shell内容合并的方法记录
- TCP/IP
- "在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke"
- 剑指offer 链表中倒数第k个节点
- 标准IO
- Greatest Parents Ligh OJ1128
- Jump Game II
- 吴恩达deeplearning.ai课程系列笔记05(下)
- react回调给父组件值.txt
- 【笔记】堆及其实现
- 图像复原与重建(1):图像退化与复原过程模型
- Android设计模式之——责任链模式
- TensorFlow —— expand_dim()函数
- 有限自动机