UK是为什么????
查看原帖
UK是为什么????
68947
wally楼主2022/10/22 09:46

菜鸡求助

#define Love_Icy 1
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define LL long long

using namespace std;

template <typename T>inline void read(T &x)
{
	T ch=getchar(),xx=0,fw=1;
	while(!isdigit(ch)){if(ch=='-')fw=-1;ch=getchar();}
	while(isdigit(ch)){xx=(xx<<1)+(xx<<3)+ch-'0';ch=getchar();}
	x=fw*xx;
}

template <typename T>inline void prt(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)prt(x/10);
	putchar(x%10+'0');
	return ;
}

int n,m,p;
LL dis[500010],D[500010];
LL H[500010],T[500010];
LL t[500010],sl[500010];
LL f[210][500010],ans;

inline LL ry(int i,int k){return f[i-1][k]+sl[k];}
inline LL rb(int i,int j){return f[i][j]+sl[j]-j*t[j];}
inline LL gb(int i,int j,int k){return ry(i,k)-k*t[j];}
//inline ll rkx(int i,int k){return k*t[j];}
inline LL cslp(LL a,LL b,LL c,int i)
{
	LL X1=a-b,X2=b-c,Y1=ry(a,i)-ry(b,i),Y2=ry(b,i)-ry(c,i);
	return X1*Y2-X2*Y1;
}

int main(void)
{
	read(n);read(m);read(p);
	for(int i=1;i<n;i++)read(D[i]);
	dis[1]=0;
	for(int i=2;i<=n;i++)dis[i]=dis[i-1]+D[i-1];
//	for(int i=1;i<=n;i++)printf("%d ",dis[i]);
	for(int i=1;i<=m;i++){read(H[i]);read(T[i]);}
	for(int i=1;i<=m;i++)t[i]=T[i]-dis[H[i]];
	sort(t+1,t+1+m);
	for(int i=1;i<=m;i++)sl[i]=sl[i-1]+t[i];
	for(int i=1;i<=m;i++)f[1][i]=t[i]*i-sl[i];
	
	int head,tail;
	int squ[100010];
	ans=f[1][m];
//	for(int i=1;i<=n;i++)printf("%d ",dis[i]);
	for(int i=2;i<=p;i++){
		head=1;tail=0;
		squ[++tail]=0;
		for(int j=1;j<=m;j++){
			while(head<tail && gb(i,j,squ[head])>gb(i,j,squ[head+1]))head++;
			f[i][j]=f[i-1][squ[head]]+(j-squ[head])*t[j]-sl[j]+sl[squ[head]];
//			f[i][j]=ry(i,squ[head])+j*t[j]-sl[j]-squ[head]*t[j];
			while(head<tail && cslp(j,squ[tail],squ[tail-1],i)>0)tail--;
			squ[++tail]=j;
		}
		ans=min(ans,f[i][m]);
	}
	printf("%lld",ans);
    return 0;
}
2022/10/22 09:46
加载中...