Educational Codeforces Round 15 E Analysis of Pathes in Functional Graph(倍增)

    xiaoxiao2021-12-14  15

    思路:由于是一个n个点n条边的有向图,并且题目的输入已经说明了每一条路径都是唯一的并且没有终点,所以可以用倍增的思想处理,令dp[i][j]为第i个节点然后走2^j这样做....没想到...

    #include<bits/stdc++.h> using namespace std; #define LL long long const int maxn = 1e5+7; int fa[maxn][35]; LL minval[maxn][35]; LL sum[maxn][35]; void init(int n) { for(int k=1;k<34;k++) for(int i = 0;i<n;i++) { fa[i][k]=fa[fa[i][k-1]][k-1]; minval[i][k]=min(minval[i][k-1],minval[fa[i][k-1]][k-1]); sum[i][k] = sum[i][k-1]+sum[fa[i][k-1]][k-1]; } } void solve(int r,LL m) { LL ansmin = 1e9+6; LL anssum = 0; for(int k = 0;k<34;k++) if(m&(1LL<<k)) { anssum+=sum[r][k]; ansmin = min(ansmin,minval[r][k]); r = fa[r][k]; } printf("%lld %lld\n",anssum,ansmin); } int main() { int n; LL m; scanf("%d%lld",&n,&m); for(int i = 0;i<n;i++) scanf("%d",&fa[i][0]); for(int i = 0;i<n;i++) { scanf("%lld",&minval[i][0]); sum[i][0]=minval[i][0]; } init(n); for(int i = 0;i<n;i++) solve(i,m); }

    E. Analysis of Pathes in Functional Graph time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output

    You are given a functional graph. It is a directed graph, in which from each vertex goes exactly one arc. The vertices are numerated from 0 to n - 1.

    Graph is given as the array f0, f1, ..., fn - 1, where fi — the number of vertex to which goes the only arc from the vertex i. Besides you are given array with weights of the arcs w0, w1, ..., wn - 1, where wi — the arc weight from i to fi.

    The graph from the first sample test.

    Also you are given the integer k (the length of the path) and you need to find for each vertex two numbers si and mi, where:

    si — the sum of the weights of all arcs of the path with length equals to k which starts from the vertex i; mi — the minimal weight from all arcs on the path with length k which starts from the vertex i.

    The length of the path is the number of arcs on this path.

    Input

    The first line contains two integers n, k (1 ≤ n ≤ 105, 1 ≤ k ≤ 1010). The second line contains the sequence f0, f1, ..., fn - 1 (0 ≤ fi < n) and the third — the sequence w0, w1, ..., wn - 1 (0 ≤ wi ≤ 108).

    Output

    Print n lines, the pair of integers si, mi in each line.

    Examples Input 7 3 1 2 3 4 3 2 6 6 3 1 4 2 2 3 Output 10 1 8 1 7 1 10 2 8 2 7 1 9 3 Input 4 4 0 1 2 3 0 1 2 3 Output 0 0 4 1 8 2 12 3 Input 5 3 1 2 3 4 0 4 1 2 14 3 Output 7 1 17 1 19 2 21 3 8 1

    转载请注明原文地址: https://ju.6miu.com/read-965593.html

    最新回复(0)