样例过了,但测出来满地红
查看原帖
样例过了,但测出来满地红
169594
Heart_Of_Iron_4楼主2025/1/25 09:55

https://www.luogu.com.cn/record/200441462

#include<bits/stdc++.h>
using namespace std;
#define int __int128_t
//#define ONLINE_JUDGE IO_copyright_Komeijizen_all_rights_reserved
namespace IO{
	char ibuf[(1<<20)+1],*iS,*iT;
#if ONLINE_JUDGE
#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
#else
#define gh() getchar()
#endif
	inline int read()
	{
		char ch=gh();
		int x=0;
		bool t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
	inline void write(int k,bool b=1)
	{
		if(k==0&&b==0)return;
		if(k<0)
		{
			putchar('-');
			write(-k,1);
		}
		else
		{
			write(k/10,0);
			putchar('0'+k%10);
		}
	}
}
using namespace IO;
#define y1 asdgniladfnli
#define y2 aslkjdhnasgfld
int n,l,d[114514],t[114514],sum1[114514],sum2[114514],t1,t2,t3,t4,dp[114514][5],y,k,x,b;
int x1,y1,x2,y2,x3,y3,ans;
struct xy
{
	int x,y;
}te;
int q[1145141],ll,rr;
inline int X(int x)
{
	return sum1[x];
}
inline int Y(int x,int y)
{
	return (dp[x][y-1]-sum2[x]+l*sum1[x]);
}
signed main()
{
	n=read();l=read();
	for(int i=1;i<=n;++i)
	{
		d[i]=read();
		t[i]=read();
	}
	if(d[n]!=l)
	{
		d[++n]=l;
		t[n]=0;
	}
	for(int i=1;i<=n;++i)
	{
		sum1[i]=sum1[i-1]+t[i];
		sum2[i]=sum2[i-1]+(l-d[i])*t[i];
	}
	for(int i=1;i<=n;++i)
	{
		dp[i][1]=dp[0][0]+sum2[i-1]-(l-d[i])*(sum1[i-1]);
	}
	for(int j=2;j<=4;++j)
	{
		ll=1,rr=0;
		memset(q,0,sizeof q);
		for(int i=0;i<=n;++i)dp[i][j]=0x3f3f3f3f;
		for(int i=1;i<=n;++i)
		{
			while(rr>ll&&Y(q[ll+1],j)-Y(q[ll],j)<=d[i]*(X(q[ll+1])-X(q[ll])))ll++;
			k=q[ll];
			dp[i][j]=dp[k][j-1]+sum2[i-1]-sum2[k]+(d[i]-l)*sum1[i-1]+(l-d[i])*sum1[k];
			x3=q[rr-1];x2=q[rr];x1=i;
			while(rr>ll&&(Y(x1,j)-Y(x2,j))*(X(x2)-X(x3))
				<=(Y(x2,j)-Y(x3,j))*(X(x1)-X(x2)))
			{
				rr--;
				x3=q[rr-1];x2=q[rr];x1=i;
			}
			q[++rr]=i;
		}
	}
/*	for(int j=2;j<=4;++j)
	{
		for(int i=1;i<=n;++i)
		{
			for(int k=1;k<i;++k)
			{
				dp[i][j]=min(dp[i][j],dp[k][j-1]+sum2[i-1]-sum2[k]+(d[i]-l)*sum1[i-1]+(l-d[i])*sum1[k]);
			}
		}
	}*/
	ans=0x3f3f3f3f;
	for(int i=1;i<=4;++i)ans=min(ans,dp[n][i]);
	write(ans);
	cout<<endl;
	return 0;
}
2025/1/25 09:55
加载中...