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
原创粉丝点击