ABC438E Heavy Buckets
ABC438E Heavy Buckets
闲话
不知道为什么,特别想要听 川嶋あい 的 《時雨》。她在这首歌中唱出来的波浪般的歌声真的很好听。
正题
考虑倍增。
实际上就是在把经过的序号加起来。但是第一眼没能看出来,本来还想要对于每一个点向环缩,但是没能成功,因为时间复杂度和实现太难了。后来去看题解,发现太简单了,对于每一个点向上倍增求最上面的点和经过的点的编号之和就可以了。
糖丸了!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
int a[200005],deg[200005];
int f[200005][30];
int sum[200005][30];
vector<int> G[200005];
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
G[i].push_back(a[i]);
f[i][0]=a[i];
sum[i][0]=i;
}
for(int i=1;i<=29;i++){
for(int j=1;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];
}
}
while(q--){
int t,k;
cin>>t>>k;
int pos=k,ans=0;
for(int i=0;i<=29;i++){
if((t>>i)&1){
ans+=sum[pos][i];
pos=f[pos][i];
}
}
cout<<ans<<"\n";
}
return 0;
}
/*
传递?
先建图.
必然到最后的某一个时间,整张图退化成 几个环
需要维护该节点何时手中没有水桶.
也就是说它的儿子中的像子树一样的东西最大深度是多少.
*/

浙公网安备 33010602011771号