警示后人
查看原帖
警示后人
199254
ShyDog楼主2022/12/22 14:35

别上来就给最下面的大圆盘赋值个INT_MAX,我特别急,结果在倍增预处理的时候,上来就爆int了。

(我真蠢哈哈)

 #define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<iostream>
#include<climits>
#include<stack>
using namespace std;
const int maxn = 100005;
int n, q, d[maxn], c[maxn];
int nxt[maxn][32], sc[maxn][32];
int lg[maxn];
int s[maxn], top = 0;
int main() {
	scanf("%d%d", &n, &q);
	for (int i = 2; i <= n; i++)	lg[i] = lg[i >> 1] + 1;
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &d[i], &c[i]);
		while (d[i] > d[s[top]] && top != 0) {
			nxt[s[top]][0] = i;
			sc[s[top]][0] = c[i];
			top--;
		}
		s[++top] = i;
	}
	c[n + 1] = INT_MAX/2;
	while (top != 0) {
		nxt[s[top]][0] = n + 1;
		sc[s[top]][0] = c[n + 1];
		top--;
	}

	for (int j = 1; j <= lg[n]; j++)
		for (int i = 1; i + (1 << j) <= n + 1; i++) {
			nxt[i][j] = nxt[nxt[i][j - 1]][j - 1];
			sc[i][j] = sc[i][j - 1] + sc[nxt[i][j - 1]][j - 1];
		}
	while (q--) {
		int r, v;
		scanf("%d%d", &r, &v);
		if (c[r] < v) {
			v -= c[r];
			for (int i = lg[n]; i >= 0; i--) {
				if (!nxt[r][i])	continue;
				if (sc[r][i] < v) {
					v -= sc[r][i];
					r = nxt[r][i];
				}
			}
			r = nxt[r][0];
		}
		if (r == n + 1)	r = 0;
		printf("%d\n", r);
	}
	return 0;
}
2022/12/22 14:35
加载中...