比赛 20140414 评测结果 AWWWWWWWWW
题目名称 登机 最终得分 10
用户昵称 隨風巽 运行时间 0.574 s
代码语言 C++ 内存使用 7.94 MiB
提交时间 2014-04-14 11:26:47
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=200000+10;
typedef long long LL;
struct node{int num,s;}cow[MAXN];
bool cmp(node a,node b){return a.s<b.s;};
LL N,f[MAXN]={0},g[MAXN]={0},t[MAXN],s[MAXN];
//f[i]表示第i头牛坐到自己位置上放好行李时的时间
//g[i]表示第i头牛最后要等的牛的编号
void DFS(LL v)
{
	if(g[v]==0)
		f[v]=s[v]-(v-N)+t[v];
	else
	{
		LL u=g[v];
		if(f[u]==0)DFS(u);
		f[v]=f[u]+s[v]-(s[u]-1)+t[v];
	}
}
int main()
{
	freopen("boarding.in","r",stdin);
	freopen("boarding.out","w",stdout);
	scanf("%d",&N);
	LL i,j,ans=0;
	for(i=1;i<=N;i++)
	{	
		scanf("%d%d",&s[i],&t[i]);//编号为i的牛想到达的位置以及整理所花时间
		cow[i]=(node){i,s[i]};
	}
	sort(cow+1,cow+1+N,cmp);
	for(i=2;i<=N;i++) //想坐i号的牛
	{
		for(j=i-1;j>=1;j--)
		{	
			if(cow[j].num>cow[i].num)
			{g[cow[i].num]=cow[j].num;break;}
		}
	}
	for(i=1;i<=N;i++)
		if(!f[i])DFS(i);
	for(i=1;i<=N;i++)
		if(f[i]>ans)
			ans=f[i];
	cout<<ans<<endl;
	return 0;
}