单调队列萌新dp蒟蒻求助
查看原帖
单调队列萌新dp蒟蒻求助
331897
C1R1A1E1F1楼主2020/10/20 20:50

(60pts)

#include <bits/stdc++.h>
using namespace std;
deque<int>q;
long long x[500005],s[500005],f[500005],us[500005];
int n,d,k;
void pu(int a)
{
	while(q.size()!=0&&f[a]>f[q.back()])
		us[q.back()]=0,q.pop_back();
	us[a]=1;
	q.push_back(a);
}
int check(int g)
{
	memset(f,0,sizeof(f));
	memset(us,0,sizeof(us));
	while(q.size()!=0)
		q.pop_front();
	int num=0;
	for(int i=1;i<=n;i++)
	{
		while(q.size()!=0&&x[i]-x[q.front()]>d+g)
			us[q.front()]=0,q.pop_front();
		while(x[i]-x[num]>=max(d-g,1)&&x[i]-x[num]<=d+g)
		{
			pu(num);
			num++;
		}
		if(q.size()==0)
			f[i]=-1;
		else
		{
			int t=q.front();
			if(f[t]==-1)
			{
				q.pop_front();
				continue;
			}
			if(f[t]+s[i]>=k)
				return 1;
			f[i]=f[t]+s[i];
		}
	}
	return 0;
}
int main()
{
	cin>>n>>d>>k;
	for(int i=1;i<=n;i++)
		cin>>x[i]>>s[i];
	int l=0,r=x[n];
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid)==1)
			r=mid;
		else
			l=mid+1;
	}
	if(check(l)==1)
		cout<<l;
	else
		cout<<-1;
}
2020/10/20 20:50
加载中...