CF702E Analysis of Pathes in Functional Graph 题解
CF702E Analysis of Pathes in Functional Graph
题面
思路
倍增板子。
设 fi,jf_{i,j}fi,j 为从 iii 跳 2j2^j2j 步到哪,sumi,jsum_{i,j}sumi,j 为从 iii 跳 2j2^j2j 步的边权和, mni,jmn_{i,j}mni,j 为从 iii 跳 2j2^j2j 步的边权最小值。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll n,k;
ll f[N][35],sum[N][35],mn[N][35];
void get(){for(int i=1;i<=34;i++){for(int j=0;j<n;j++){f[j][i]=f[f[j][i-1]][i-1];sum[j][i]=sum[j][i-1]+sum[f[j][i-1]][i-1];mn[j][i]=min(mn[j][i-1],mn[f[j][i-1]][i-1]);}}
}
void solve(int x){ll ans=0,minn=1e18;ll kk=k;for(int i=34;i>=0;i--){if((1ll<<i)<=kk){ans+=sum[x][i];minn=min(minn,mn[x][i]);x=f[x][i];kk-=(1ll<<i);}}cout<<ans<<" "<<minn<<"\n";return;
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);memset(mn,0x3f3f,sizeof(mn));cin>>n>>k;for(int i=0;i<n;i++){cin>>f[i][0]; }for(int i=0;i<n;i++){cin>>sum[i][0];mn[i][0]=sum[i][0];}get();for(int i=0;i<n;i++){solve(i);}return 0;
}