记录编号 200516 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 Gravatarthomount 是否通过 通过
代码语言 C++ 运行时间 1.796 s
提交时间 2015-10-28 21:30:58 内存使用 32.89 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int read() {
	char ch = getchar();
	while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
	int ans = 0, flag = 1;
	if (ch == '-') flag = -1, ch = getchar();
	while (ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar();
	return ans * flag;
}
const int N = 1000010;
struct point {
	int x, w, s;
	point(int s = 0, int w = 0, int x = 0): x(x), w(w), s(s) {}
} p[2*N];
bool operator < (point a, point b) {
	return (a.w < b.w);
}
int d[N], f[N], a[N];
int main() {
	freopen("classrooms.in", "r", stdin);
	freopen("classrooms.out", "w", stdout);
	int n = read(), m = read();
	
	for (int i = 1; i <= n; i++) a[i] = read();
	for (int i = 1; i <= m; i++) {
		int D = read(), L = read(), R = read();
		d[i] = D;
		p[2*i-1] = point(D, L, i);
		p[2*i] = point(-D, R+1, i);
	}
	
	sort(p+1, p+2*m+1);
	int st = 1, bad = m+1;
	memset(f, 0, sizeof(f));
	long long S = 0;
	for (int i = 1; i <= n; i++) {
		while (st <= 2*m && p[st].w == i) {
			if (p[st].x <= bad) {
				S += p[st].s;
				if (p[st].s < 0) f[p[st].x] = 0; else f[p[st].x] = 1;
			}
			st++;
		}
		if (S > a[i]) {
			while (bad > 1 && S > a[i]) {
				if (f[bad-1]) {
					S -= d[bad-1];
					f[bad-1] = 0;
				}
				bad--;
			}
		}
		if (bad == 1) break;
	}
	
	if (bad == m+1) printf("0\n"); else printf("-1\n%d\n", bad);
	return 0;
}