[WOJ4354] 蜀石经

题目链接:###

点我

题目分析:###

大模拟,貌似\(O(n^2)\)也可以卡常过,复杂度正确的做法是用优先队列维护。

代码:###

#include<bits/stdc++.h>
#define N (100000+5)
using namespace std;
struct node{
	int a;int t;int num;
	friend bool operator < (node a,node b){
		return a.num>b.num;
	}
}st[N];
priority_queue<node>q;
inline int read(){
	int cnt=0,f=1;char c;
	c=getchar();
	while(!isdigit(c)){
		if(c=='-') f=-f;
		c=getchar();
	}
	while(isdigit(c)){
		cnt=cnt*10+c-'0';
		c=getchar();
	}
	return cnt*f;
}
int n,last,wait,ans;
bool cmp2(node a,node b){
	return a.a<b.a;
}
int main(){
	n=read();
	for(register int i=1;i<=n;i++) {
		st[i].a=read();st[i].t=read();
		st[i].t+=st[i].a;st[i].num=i;
	}
	sort(st+1,st+n+1,cmp2);
	last=st[1].t;
	for(register int i=2;i<=n;i++) {
	 	if(st[i].a>=last) {
	 		if(q.empty()) last=st[i].t;
	 		else{
	 			wait=last-q.top().a;
	 			ans=max(ans,wait);
	 			last=wait+q.top().t;
	 			q.pop();
	 			if(last<st[i].a) --i;
	 			else q.push(st[i]);
	 		}
	 	}
	 	else q.push(st[i]);
	}
	while(!q.empty()){
		wait=last-q.top().a;
	 	ans=max(ans,wait);
	 	last=q.top().t;
	 	q.pop();
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2019-01-28 19:06  kma_093  阅读(119)  评论(0编辑  收藏  举报