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

思路:由于是一个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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值