50分求助
查看原帖
50分求助
198964
Msents楼主2022/4/28 19:48

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,d,k,f[500005],maxdis=LLONG_MIN;
struct node{
	int dis,score;
}a[500005];
bool check(int g){
	deque<int>q;
	int pi=0;
	a[0].dis=0,a[0].score=0;
	f[0]=0;
	for(int i=1;i<=n;i++){
		while((!q.empty())&&(a[i].dis>a[q.front()].dis+d+g))q.pop_front();
		while((pi<i)&&(a[pi].dis+max(1ll,d-g)<=a[i].dis)&&(a[i].dis<=a[pi].dis+d+g)){
			if(f[pi]==LLONG_MIN){
				pi++;
				continue;
			}
			while((!q.empty())&&(f[pi]>=f[q.back()]))q.pop_back();
			q.push_back(pi);
			pi++;
		}
		if(q.empty())f[i]=LLONG_MIN;
		else f[i]=f[q.front()]+a[i].score;
		if(f[i]>=k)return true;
	}
	return false;
}
int fun(){
	int ans=0;
	for(int i=1;i<=n;i++)if(a[i].score>0)ans+=a[i].score;
	if(ans<k)return -1;
	int l=0,r=1e9+7,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid))r=mid-1;
		else l=mid+1;
	}
	return l;
}
void read(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>d>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i].dis>>a[i].score;
		maxdis=max(maxdis,a[i].dis);
	}
}
signed main(){
	read();
	cout<<fun();
	return 0;
}
2022/4/28 19:48
加载中...