题解:P14467 [COCI 2025/2026 #1] 扔球 / Krugomet
题目大意
题目题意清楚不做过多概述。
思路
先考虑普通按照题目意思模拟的思路,每一次都让一次球,但是
预处理
在之前我们学习过倍增法,定义
意思:就是第一次传
时间复杂度验证
时间复杂度为
关键代码
for(int j = 1; (1<<j) < k; j++)//预处理部分
for(int i = 1; i <= n; i++)
s[i][j] = s[s[i][j-1]][j-1];
for(int j = __lg(k)+1; j >= 0; j--) {//压缩完成后进行计算
if(st+(1<<j) < k) {
st += (1<<j);
for(int i = 1; i <= n; i++)t[i] = 0;
for(int i = 1; i <= n; i++)t[s[i][j]] += a[i];
for(int i = 1; i <= n; i++)a[i] = t[i];
}
}