分块萌新求调
  • 板块CF13E Holes
  • 楼主Ryo_Yamada
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/10/5 20:30
  • 上次更新2023/11/5 11:53:49
查看原帖
分块萌新求调
242543
Ryo_Yamada楼主2020/10/5 20:30

rt,WA 2

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

int n, m, blocksize, ans;
int k[N], st[N], nxt[N], blocknum[N];

int query(int x) {
	int ret = 0;
	while(1) {
		ret += st[x];
		ans = x;
		if(!nxt[x]) return ret;
		x = nxt[x];
	}
}

int main() {
	cin >> n >> m;
	blocksize = sqrt(n);
	for(int i = 1; i <= n; i++) scanf("%d", k + i);
	for(int i = 1; i <= n; i++) blocknum[i] = (i - 1) / blocksize + 1;
	for(int i = n; i; i--) {
		if(i + k[i] > n) st[i] = 1;
		else {
			if(blocknum[i] == blocknum[i + k[i]]) {
				st[i] = st[i + k[i]] + 1;
				nxt[i] = nxt[i + k[i]];
			}
			else {
				st[i] = 1;
				nxt[i] = i + k[i];
			}
		}
	}
	while(m--) {
		int opt, x, y;
		scanf("%d%d", &opt, &x);
		if(opt == 1) {
			int K = query(x);
			printf("%d %d\n", ans, K);
		}
		else {
			scanf("%d", &y);
			k[x] = y;
			for(int i = x; i >= (blocknum[x] - 1) * blocksize + 1; i--) {
				if(blocknum[i] == blocknum[i + k[i]]) {
					st[i] = st[i + k[i]] + 1;
					nxt[i] = nxt[i + k[i]];
				}
				else {
					st[i] = 1;
					nxt[i] = i + k[i];
				}
			}
		}
	}
	return 0;
}
2020/10/5 20:30
加载中...