返回题解分享
讨论 / 题解分享/ 帖子详情

游戏 - 题解

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,ans,m;
long long x,f[N],s[N];
priority_queue<int>q;
struct st {
	long long d,s;
} a[N];
bool cmp(const st x,const st y)
{
	if(x.d*y.d<=0)
		return x.d>y.d;
	else
		return max(x.s-x.d,y.s-x.d-y.d)<max(y.s-y.d,x.s-y.d-x.d);
}
void solve()
{
	memset(f,0,sizeof f),cin>>n>>x,ans=0;
	for(int i=1; i<=n; ++i)
		cin>>a[i].d>>a[i].s;
	sort(a+1,a+1+n,cmp),a[n+1].d=-1;
	int k1=0,k2=n+1;
	long long w=0;
	for(int i=1; i<=n; ++i)
	{
		if(a[i].d>0&&a[i+1].d<=0)
			k1=i;
		if(a[i].d<0&&a[i-1].d>=0)
			k2=i;
		s[i]=s[i-1]+a[i].d;
	}
	for(int i=k1+1; i<k2; ++i)
		ans+=s[i]+x>=a[i].s;
	while(!q.empty())
		q.pop();
	for(int i=k1; i>=1; --i)
	{
		if(w+s[i]+x>=a[i].s)
			++ans,q.push(a[i].d);
		else
		{
			q.push(a[i].d);
			w+=q.top();
			q.pop();
		}
	}
	while(!q.empty())
		q.pop();
	x=s[n]+x,w=0;
	s[n+1]=0;
	for(int i=n;i>=k2;--i)
		s[i]=s[i+1]-a[i].d;
	for(int i=k2; i<=n; ++i)
	{
		if(w+s[i+1]+x>=a[i].s)
			++ans,q.push(-a[i].d);
		else
		{
			q.push(-a[i].d);
			w+=q.top();
			q.pop();
		}
	}
	cout<<ans<<endl;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int T;
	cin>>T;
	while(T--)
		solve();
	return 0;
}
0 回复 0 转发 0 喜欢 3 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!