记录编号 |
67906 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2012]借教室 |
最终得分 |
100 |
用户昵称 |
Hobo |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.531 s |
提交时间 |
2013-08-15 13:49:00 |
内存使用 |
16.48 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ULL unsigned long long
#define MAXN 1000000+10
using namespace std;
int N,M,L,R,NOW,K,SSUM,ROOM[MAXN],D[MAXN],S[MAXN],T[MAXN],SUM[MAXN];
bool F;
void init()
{
cin>>N>>M;
for (int i=1;i<=N;i++) scanf("%d",&ROOM[i]);
for (int i=1;i<=M;i++) scanf("%d%d%d",&D[i],&S[i],&T[i]);
}
void print()
{
cout<<"0"<<endl;
exit(0);
}
void work()
{
NOW=0;
L=0;
R=M+1;
do {
F=1;
K=(L+R)>>1;
if (K>NOW)
for (int i=NOW+1;i<=K;i++)
{
SUM[S[i]]+=D[i];
SUM[T[i]+1]-=D[i];
}
else
for (int i=K+1;i<=NOW;i++)
{
SUM[S[i]]-=D[i];
SUM[T[i]+1]+=D[i];
}
NOW=K;
SSUM=0;
for (int i=1;i<=N;i++)
{
SSUM+=SUM[i];
if (SSUM>ROOM[i]) {F=0;break;}
}
if (F) L=K+1; else R=K;
}
while (L!=R);
if (K==M && F) print();
cout<<"-1"<<endl;
cout<<L;
}
int main()
{
freopen("classrooms.in","r",stdin);
freopen("classrooms.out","w",stdout);
init();
work();
return 0;
}