太水了,可惜没时间了
直接用倍增去看水桶 iii 在第 2i2^i2i 次传递到谁手里。处理时暴力跳即可。
总时间复杂度:O(nlogn+qlogn)。
code:
#include <bits/stdc++.h>
using namespace std;
long long n, q, a[200005], b[200005][35], c[200005][35];
int main(){
scanf("%lld %lld", &n, &q);
for(int i = 1;i<=n;i++){
scanf("%lld", &a[i]);
b[i][0] = a[i];
c[i][0] = i;
}
for(int j = 1;j<=30;j++){
for(int i = 1;i<=n;i++){
b[i][j] = b[b[i][j - 1]][j - 1];
c[i][j] = c[i][j - 1] + c[b[i][j - 1]][j - 1];
}
}
while(q--){
long long x, y, da = 0;
scanf("%lld %lld", &x, &y);
for(int i = 0;i<=30;i++){
if((x & (1 << i))==(1 << i)){
da += c[y][i];
y = b[y][i];
}
}
printf("%lld\n", da);
}
return 0;
}
举一反三:洛谷P6148。
1516

被折叠的 条评论
为什么被折叠?



