哪位dalao可以看一下蒟蒻的50分代码吗?蒟蒻感激不尽啊啊啊!!
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 1000000001
using namespace std;
const int N=500005;
int x[N],s[N],dp[N];
int pq[N],head,tail;
int n,d,k;
void _read()
{
scanf("%d%d%d",&n,&d,&k);
for (int i=1;i<=n;i++)
scanf("%d%d",&x[i],&s[i]);
}
inline void _write(int x)
{
printf("$$%d\n",x);
for(int i=1;i<=n;i++)
printf("%d ",dp[i]);
return ;
}
bool check(int q)
{
int now=1;
head=1,tail=0;
int least=max(d-q,1),most=d+q;
for (int i=1;i<=n;i++)
dp[i]=-INF;
dp[0]=0;
memset(pq,0,sizeof(pq));
pq[++tail]=0;
// printf("check:%d\n",q);
for (int i=1;i<=n;i++)
{ /*1.加入新元素*/
while(now<i&&x[i]-x[now]>=least&&x[i]-x[now]<=most)
{
while(head<=tail&&dp[now]>=dp[pq[tail]])tail--;
pq[++tail]=now;
now++;
}
/*2.删除对头过期元素*/
while(head<=tail&&x[i]-x[pq[head]]>most)head++;
// printf("i:%d\n",i);
// for (int j=head;j<=tail;j++)
// printf("%d ",pq[j]);
// puts("");
/*3.处理dp[i]*/
dp[i]=dp[pq[head]]+s[i];
if (dp[i]>=k)return true;
}
// _write(q);
return false;
}
/*
*/
void _cut()
{
bool flag=false;
int lb=0,rb=INF,mid;//二分金币数目
while(lb<rb)
{
mid=(lb+rb)/2;
if (check(mid)){
rb=mid;flag=1;
}else lb=mid+1;
}
if(flag)printf("%d",rb);
else printf("-1");
return ;
}
int main()
{
_read();
_cut();
return 0;
}