Educational Codeforces Round 19 E. Array Queries

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;
}
posted @ 2024-10-29 11:43  PHarr  阅读(6)  评论(0编辑  收藏  举报