记录编号 81913 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2012]借教室 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 2.211 s
提交时间 2013-11-19 17:58:05 内存使用 0.30 MiB
显示代码纯文本
#include <fstream>

using namespace std;

ifstream in("classrooms.in");
ofstream out("classrooms.out");

struct node
{
	long start;
	long end;
	long rooms;
};

long n,m;
long *rest;
node *order;
long *comp;

void input();
void proc();

int main()
{
	input();
	proc();
	return 0;
}

void input()
{
	in>>n>>m;
	rest=new long [n+1];
	comp=new long [n+2];
	order=new node [m+1];
	for(long i=1;i!=n+1;++i)
	{
		in>>rest[i];
	}
	for(long i=1;i!=m+1;++i)
	{
		register long s,e,r;
		in>>r>>s>>e;
		order[i].start=s;
		order[i].end=e;
		order[i].rooms=r;
	}
}

bool partition(long s, long e)
{
	long mi(s+(e-s)/2);
	for(int i=1;i!=n+1;++i)
	{
		comp[i]=0;
	}
	for(int i=1;i!=mi+1;++i)
	{
		comp[order[i].start]+=order[i].rooms;
		comp[order[i].end+1]-=order[i].rooms;
	}
	long temp(0);
	for(int i=1;i!=n+1;++i)
	{
		temp+=comp[i];
		if(rest[i]<temp)
		{
			return false;
		}
	}
	return true;
}

void proc()
{
	long start(1);
	long end(m);//m敲成n了
	if(partition(1, 2*m-3))
	{
		out<<0<<endl;
		return ;
	}
	while(end!=start)
	{
		bool btemp(partition(start, end));
		if(!btemp)
		{
			end=start+(end-start)/2;
		}
		else
		{
			start=end-(end-start)/2;
		}
	}
	out<<-1<<endl<<start<<endl;
}