问dis数组有何不同
查看原帖
问dis数组有何不同
591863
Lofty楼主2023/9/27 09:29

90 pts:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define TP template<typename T>
#define TP_ template<typename T,typename ... T_>
TP void read(T &x)
{
	x=0;int f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	x*=f;
}
TP_ void read(T &x,T_&...y){read(x);read(y...);}
TP void write(T x){if(x<0){putchar('-'),x=-x;}if(x>9)write(x/10);putchar(48+x%10);}
TP void writeln(T &x){write(x);puts("");}
TP void writesp(T &x){write(x);putchar(' ');}
TP_ void writeln(const T &x,T_ &...y){writesp(x);writeln(y...);}
typedef long long LL;
constexpr int N=1100;
//constexpr double eps=1e-6;
int n,m;
int w[N][N],f[N][N],pos[N],dis[N];
int l,r,q[N];
long double X(int j){return 1.0*j;}
long double Y(int j){return 1.0*(f[pos[j]][j]-dis[j]-j*j);}
long double slop(int j1,int j2){return j1==j2?-1e18:(Y(j2)-Y(j1))/(X(j1)-X(j2));}
int main()
{
	read(n,m);
	for(int i=1,x,y;i<=n;i++)
		read(x,y),read(w[x][y]);
	f[1][1]=w[1][1];pos[1]=1;w[1][1]=0;
	for(int x=1;x<=m;x++)
	{
//		for(int y=1;y<=m;y++)dis[y]=(pos[y]!=0)*(pos[y]-x)*(pos[y]-x);
		l=1;r=0;q[l]=0;
		for(int y=1;y<=m;y++)
		{
			if(pos[y])
			{
				while(l<r&&slop(q[r],q[r-1])>=slop(y,q[r]))r--;
				q[++r]=y;
				dis[y]=(pos[y]-x)*(pos[y]-x);
			}
			if(w[x][y])
			{
				while(l<r&&slop(q[l+1],q[l])<=2.0*y)l++;
				f[x][y]=f[pos[q[l]]][q[l]]-dis[q[l]]-(q[l]-y)*(q[l]-y)+w[x][y];
				pos[y]=x;dis[y]=0;
				while(l<r&&slop(q[r],q[r-1])>=slop(y,q[r]))r--;
				q[++r]=y;
			}
		}
	}
	writeln(f[m][m]);
	return 0;
}
/*
f[i][j]=f[pos[q]][q]-(pos[q]-i)^2-(q-j)^2+w[i][j]

f[i]=f[j]-dis[j]-(i-j)^2+w[i]
f[i]=f[j]-dis[j]-i^2+2*i*j-j^2+w[i]
f[j]-dis[j]-j^2=-2*j*i-w[i]+i^2+f[i]
2*j*i+w[i]-i^2-f[i]=dis[j]+j^2-f[j]
*/

100 pts:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define TP template<typename T>
#define TP_ template<typename T,typename ... T_>
TP void read(T &x)
{
	x=0;int f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	x*=f;
}
TP_ void read(T &x,T_&...y){read(x);read(y...);}
TP void write(T x){if(x<0){putchar('-'),x=-x;}if(x>9)write(x/10);putchar(48+x%10);}
TP void writeln(T &x){write(x);puts("");}
TP void writesp(T &x){write(x);putchar(' ');}
TP_ void writeln(const T &x,T_ &...y){writesp(x);writeln(y...);}
typedef long long LL;
constexpr int N=1100;
//constexpr double eps=1e-6;
int n,m;
int w[N][N],f[N][N],pos[N],dis[N];
int l,r,q[N];
long double X(int j){return 1.0*j;}
long double Y(int j){return 1.0*(f[pos[j]][j]-dis[j]-j*j);}
long double slop(int j1,int j2){return j1==j2?-1e18:(Y(j2)-Y(j1))/(X(j1)-X(j2));}
int main()
{
	read(n,m);
	for(int i=1,x,y;i<=n;i++)
		read(x,y),read(w[x][y]);
	f[1][1]=w[1][1];pos[1]=1;w[1][1]=0;
	for(int x=1;x<=m;x++)
	{
		for(int y=1;y<=m;y++)dis[y]=(pos[y]!=0)*(pos[y]-x)*(pos[y]-x);
		l=1;r=0;q[l]=0;
		for(int y=1;y<=m;y++)
		{
			if(pos[y])
			{
				while(l<r&&slop(q[r],q[r-1])>=slop(y,q[r]))r--;
				q[++r]=y;
//				dis[y]=(pos[y]-x)*(pos[y]-x);
			}
			if(w[x][y])
			{
				while(l<r&&slop(q[l+1],q[l])<=2.0*y)l++;
				f[x][y]=f[pos[q[l]]][q[l]]-dis[q[l]]-(q[l]-y)*(q[l]-y)+w[x][y];
				pos[y]=x;dis[y]=0;
				while(l<r&&slop(q[r],q[r-1])>=slop(y,q[r]))r--;
				q[++r]=y;
			}
		}
	}
	writeln(f[m][m]);
	return 0;
}
/*
f[i][j]=f[pos[q]][q]-(pos[q]-i)^2-(q-j)^2+w[i][j]

f[i]=f[j]-dis[j]-(i-j)^2+w[i]
f[i]=f[j]-dis[j]-i^2+2*i*j-j^2+w[i]
f[j]-dis[j]-j^2=-2*j*i-w[i]+i^2+f[i]
2*j*i+w[i]-i^2-f[i]=dis[j]+j^2-f[j]
*/
2023/9/27 09:29
加载中...