蒟蒻求助
查看原帖
蒟蒻求助
68960
M_and_P_楼主2020/10/27 13:36

哪位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;
}
2020/10/27 13:36
加载中...