赞
踩
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
long long int dis,va;
};
node c[500009];
long long int f[500009];
long long int m,n,k;
int cal(int t)
{
memset(f,-127,sizeof(f));
f[0]=0;
int ll,rr;
if(n>t)ll=n-t;
else ll=1;
rr=n+t;
for(int i=1;i<=m;i++)
{
for(int j=i-1;j>=0;j--)
{
if(c[i].dis-c[j].dis<ll)continue;
if(c[i].dis-c[j].dis>rr)break;
if(f[j]>=-0x7ffffff)
f[i]=max(f[i],f[j]+c[i].va);
}
if(f[i]>=k)return 1;
}
return 0;
}
bool cmp(node a,node b)
{
return a.dis<b.dis;
}
int main()
{
scanf("%lld%lld%lld",&m,&n,&k);
for(int i=1;i<=m;i++)
scanf("%lld%lld",&c[i].dis,&c[i].va);
sort(c+1,c+m+1,cmp);
long long int l=0;
long long int ans=-1;
long long int r=2000;
while(l<=r)
{
int mid=(l+r)>>1;
if(cal(mid)==1)
{
r=mid-1;
ans=mid;
}
else l=mid+1;
}
printf("%lld",ans);
return 0;
}
双端队列优化
include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<deque>
using namespace std;
struct node
{
long long int dis,va;
};
node c[500009];
long long int f[500009];
deque<long long int> q;
long long int m,n,k;
int cal(long long int y)
{
memset(f,0,sizeof(f));
long long int ll,rr;
if(n>y)ll=n-y;
else ll=1;
long long int cur=0;
rr=n+y;
for(int i=1;i<=m;i++)
{
while(cur<i&&c[i].dis-c[cur].dis>=ll)
{
while(q.empty()==0&&f[q.back()]<=f[cur])q.pop_back();
q.push_back(cur);
cur++;
}
while(q.empty()==0&&c[i].dis-c[q.front()].dis>rr)q.pop_front();
if(q.empty()==1)f[i]=-999999999999;
else f[i]=f[q.front()]+c[i].va;
if(f[i]>=k)return 1;
}
while(q.empty()==0)q.pop_back();
return 0;
}
bool cmp(node a,node b)
{
return a.dis<b.dis;
}
int main()
{
scanf("%lld%lld%lld",&m,&n,&k);
for(int i=1;i<=m;i++)
scanf("%lld%lld",&c[i].dis,&c[i].va);
sort(c+1,c+m+1,cmp);
long long int l=0;
long long int ans=-1;
long long int r=1e9;
while(l<=r)
{
int mid=(l+r)>>1;
if(cal(mid)==1)
{
r=mid-1;
ans=mid;
}
else l=mid+1;
}
printf("%lld",ans);
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。