记录编号 441369 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 GravatarFisher. 是否通过 通过
代码语言 C++ 运行时间 1.143 s
提交时间 2017-08-24 22:02:46 内存使用 19.39 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
/*
	维护序列,区间减法。找到第一个非法操作的标号
	区间减法用差分实现; 
	非法操作:区间内有一个数减到零以下;
	采用二分:
	单调性:假如i号操作非法,那么直接输出i;
	验证也比较简单; 
*/
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
const int maxn=1e6+10;
int n,m; 
int data[maxn];
int caozuo[maxn];
int sum[maxn],st[maxn],en[maxn];//减的值,开始时间,结束时间。
inline bool ok(int g){
	int tot=0;
	for(int i=1;i<=n;i++)caozuo[i]=0;
	for(int i=1;i<=g;i++){//1到猜的编号就行了。 
		caozuo[st[i]]+=sum[i];
		caozuo[en[i]+1]-=sum[i];
	}
	for(int i=1;i<=n;i++){
		tot+=caozuo[i];
		if(tot>data[i])return false;
	}
	return true;
}
inline int erfen(){
	int l=1,r=n+1;
	while(l+1<r){
		int m=(l+r)>>1;
		if(ok(m))l=m;
		else r=m;
	}
	if(ok(l))return r;
	return l;
}
int main(){
	freopen("classrooms.in","r",stdin);
	freopen("classrooms.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++)data[i]=read();
	for(int i=1;i<=m;i++){
		sum[i]=read();st[i]=read();en[i]=read();
	}
	int ans=erfen();
	if(ans==n+1)puts("0");
	else {
		puts("-1");
		printf("%d\n",ans);
	} 
	return 0;
}