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;
}