Educational Codeforces Round 19 E. Array Queries

PHarr發表於2024-10-29

https://codeforces.com/contest/797/problem/E

其實是個詐騙題,我們可以思考一下暴力有哪些解法。

  1. 對於一個詢問直接向後暴力的查詢
  2. 從後向前列舉\(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;
}

相關文章