记录编号 |
295390 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2012]借教室 |
最终得分 |
100 |
用户昵称 |
安呐一条小咸鱼。 |
是否通过 |
通过 |
代码语言 |
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");
}