记录编号 345909 评测结果 WWWWWWWAWWWWWWWWWTTT
题目名称 [NOIP 2012]借教室 最终得分 5
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 6.488 s
提交时间 2016-11-11 19:38:04 内存使用 6.23 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1050010;
void madd(int,int,int);
int qmin(int,int);
int n,M=1,m,l,r,d,mn[maxn<<1]={0};
int main(){
#define MINE
#ifdef MINE
	freopen("classrooms.in","r",stdin);
	freopen("classrooms.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	while(M<n+2)M<<=1;
	for(int i=1;i<=n;i++)scanf("%d",&mn[i+M]);
	for(int i=M-1;i;i--){
		mn[i]=max(mn[i<<1],mn[i<<1|1]);
		mn[i<<1]-=mn[i];mn[i<<1|1]-=mn[i];
	}
	int i=1;
	for(;i<=m;i++){
		scanf("%d%d%d",&d,&l,&r);
		madd(l,r,-d);
		if(qmin(l,r)<0)break;
	}
	if(i>m)printf("0");
	else printf("-1\n%d",i);
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#endif
	return 0;
}
void madd(int l,int r,int d){
	int a;
	for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
		if(~l&1)mn[l^1]+=d;
		if(r&1)mn[r^1]+=d;
		a=max(mn[l],mn[l^1]);mn[l]-=a;mn[l^1]-=a;mn[l>>1]+=a;
		a=max(mn[r],mn[r^1]);mn[r]-=a;mn[r^1]-=a;mn[r>>1]+=a;
	}
}
int qmin(int l,int r){
	int lans=0,rans=0;
	for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
		lans+=mn[l];rans+=mn[r];
		if(~l&1)lans=min(lans,mn[l^1]);
		if(r&1)rans=min(rans,mn[r^1]);
	}
	lans=min(lans,rans);
	while(l^1)lans+=mn[l>>=1];
	return lans;
}