lightoj 1128 倍增法+dp
来源:互联网 发布:spss软件下载 官方 编辑:程序博客网 时间:2024/05/29 18:13
题解转自:http://blog.csdn.net/u013649253/article/details/46240861
代码:
#include<bits/stdc++.h>#define _xx ios_base::sync_with_stdio(0),cin.tie(0);using namespace std;const int MAXN = 100005;const int maxp = 18;vector<int> node[MAXN];int fa[MAXN][maxp];int dp[MAXN][maxp];int value[MAXN];int N, Q;void dfs(int id) { for (int i = 0; i < node[id].size(); i++) { int v = node[id][i]; fa[v][0] = id; dp[v][0] = value[v]; for (int j = 1; j < maxp; j++) fa[v][j] = fa[fa[v][j - 1]][j - 1]; for (int j = 1; j < maxp; j++) dp[v][j] = max(dp[v][j - 1], dp[fa[v][j - 1]][j - 1]); dfs(v); }}int solve(int x, int y) { for (int i = maxp - 1; i >= 0; i--) { if (dp[fa[x][i]][i] >= y) x = fa[x][i]; } return x;}int main() { int T, icase = 1, x, y; cin >> T; while (T--) { cin >> N >> Q; for (int i = 0; i <= N; i++)node[i].clear(); value[0] = 1; for (int i = 0; i < maxp; i++) { fa[0][i] = 0; dp[0][i] = value[0]; } for (int i = 1; i < N; i++) { scanf("%d%d", &x, &y); node[x].push_back(i); value[i] = y; } dfs(0); printf("Case %d:\n", icase++); while (Q--) { scanf("%d%d", &x, &y); printf("%d\n", solve(x, y)); } }}
0 0
- lightoj 1128 倍增法+dp
- LightOJ - 1128 (倍增法 + dp)
- light oj 1128 倍增法LCA + DP
- LightOJ 1162 Min Max Roads(LCA倍增法或树链剖分)
- lca倍增dp
- ZOJ 3649 倍增法DP、树链剖分、tarjan并查集
- 倍增法
- zoj 3649 lca 倍增 DP
- hdu2604 queuing(dp+矩阵倍增)
- Tyvj4879(dp+倍增+NTT)
- lightoj 1140 数位DP
- lightoj 1032 数位DP
- lightoj 1068 数位DP
- lightoj 1205 数位DP
- lightoj 1422 区间DP
- Lightoj 1004 DP
- Lightoj 1013 DP
- Lightoj 1017 DP
- 当类对象作为成员看初始化列表的意义
- 【小型系统】抽奖系统-使用Java Swing完成
- 二叉树总结
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- CFgym:Database(字符串处理)
- lightoj 1128 倍增法+dp
- 使用Meta,试做网页,3秒后跳转到指定页面
- hdu 3584 Cube(三维树状数组)
- requests+beautifulsoup4 爬虫实战
- 【JVM】JVM系列之垃圾回收(二)
- 内部类
- 硅谷未来科技与创业企业
- Web Service系列之实例之spyne
- 机器学习的最佳入门学习资源