Educational Codeforces Round 19 E. Array Queries
https://codeforces.com/contest/797/problem/E
其实是个诈骗题,我们可以思考一下暴力有哪些解法。
- 对于一个询问直接向后暴力的查询
- 从后向前枚举\(n\),并预处理出每个\(k\)需要多少步。
我们可以按照\(k\) 分类,如果\(k< \sqrt n\)我们预处理,否则我们暴力的查询,这样的话,复杂度是\(O(n \sqrt n)\)
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
const int inf = INT_MAX / 2;
int main() {
int n;
cin >> n;
vector<int> a(n + 1);
for(int i = 1; i <= n; i ++)
cin >> a[i];
int K = sqrt(n);
vector f(K + 1, vi(n + 1));
for(int i = 1; i <= K; i ++) {
for(int j = n, l; j >= 1; j --) {
l = j + a[j] + i;
if(l > n) f[i][j] = 1;
else f[i][j] = f[i][l] + 1;
}
}
int q;
cin >> q;
for(int p, k, cnt; q; q --) {
cin >> p >> k;
if(k <= K) {
cout << f[k][p] << "\n";
} else {
cnt = 0;
while(p <= n) {
p = p + a[p] + k;
cnt ++;
}
cout << cnt << "\n";
}
}
return 0;
}