记录编号 295390 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 2.735 s
提交时间 2016-08-13 17:55:26 内存使用 14.54 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#define maxn 1000100
using namespace std;
int n,m;
int f[maxn],r[maxn],w[maxn],s[maxn],t[maxn];
bool check(int x){
	int tot=0;
	//printf("%d x ",x);
	for(int i=1;i<=n;i++)
	{
		tot+=f[i];
		if(tot>r[i])return false;
	}//printf("true %d\n",x);
	return true;
}
int main(){
	freopen("classrooms.in","r",stdin);
	freopen("classrooms.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&r[i]);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&w[i],&s[i],&t[i]);
	int l=1,r=m;
	int mid=(l+r)>>1;
	for(int i=1;i<=mid;i++)
		f[s[i]]+=w[i],f[t[i]+1]-=w[i];
	while(l^r){
		if(check(mid)){
			l=mid+1;
			for(int i=mid+1;i<=(l+r)>>1;i++)
				f[s[i]]+=w[i],f[t[i]+1]-=w[i];
			
		}
		else{
			r=mid;
			for(int i=((l+r)>>1)+1;i<=mid;i++)
				f[s[i]]-=w[i],f[t[i]+1]+=w[i];
		}
		mid=(l+r)>>1;
	}
	if(l!=m)cout<<-1<<endl<<l<<endl;
	else puts("0");
}