暑期cspj模拟赛9
已结束
ACM/ICPC
开始于: 2025-8-21 17:30
24
小时
主持人:
8
暑期cspj模拟赛9
T4
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 50;
const int LOG = 40;
int nxt[N]; // 每个节点的下一个节点
long long sum[N][LOG+5]; // sum[i][j]: 从i出发走2^j步的节点编号和
int to[N][LOG+5]; // to[i][j]: 从i出发走2^j步到达的节点
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
// 读取图结构
for (int i = 1; i <= n; ++i) {
cin >> nxt[i];
}
// 预处理倍增表
for (int i = 1; i <= n; ++i) {
to[i][0] = nxt[i];
sum[i][0] = nxt[i];
}
for (int j = 1; j <= LOG; ++j) {
for (int i = 1; i <= n; ++i) {
to[i][j] = to[to[i][j-1]][j-1];
sum[i][j] = sum[i][j-1] + sum[to[i][j-1]][j-1];
}
}
// 处理查询
while (q--) {
int x;
long long k;
cin >> x >> k;
long long ans = 0;
int cur = x;
// 使用倍增法计算路径和
for (int j = LOG; j >= 0; --j) {
if (k >= (1LL << j)) {
ans += sum[cur][j];
cur = to[cur][j];
k -= (1LL << j);
}
}
cout << ans << '\n';
}
return 0;
}
- 状态
- 已结束
- 规则
- ACM/ICPC
- 题目
- 4
- 开始于
- 2025-8-21 17:30
- 结束于
- 2025-8-22 17:30
- 持续时间
- 24 小时
- 主持人
- 参赛人数
- 8