梅什科线圈TLE84分求助!

题目:



这是我的TLE84分代码:

#include<cstdio>
#define N 3001
#ifdef ONLINE_JUDGE
#define getchar getchar_unlocked
#else
#define getchar _getchar_nolock
#endif
int n,x[N],y[N],sy[N],ssy[N],d[N][N];
long long ans;
bool flag1=false,flag2=false;
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<3)+(x<<1)+c-48;
	return x*f;
}
inline int abs(const int &x)
{
	return x>=0?x:-x;
}
inline void solveBF_()
{
	for(int i=1;i<n-1;++i)
		for(int j=i+1;j<n;++j)
			for(int k=j+1;k<=n;++k){
				//x[i]*y[j]-x[j]*y[i]+x[j]*y[k]-x[k]*y[j]+x[k]*y[i]-x[i]*y[k];
				int r=0;
				r+=x[i]*y[j]-x[j]*y[i];
				r+=x[j]*y[k]-x[k]*y[j];
				r+=x[k]*y[i]-x[i]*y[k];
				ans+=abs(r);
			}
	printf("%.1lf",ans/2.0);
}
inline void solveBF__()
{
	for(int i=1;i<n-1;++i)
		for(int j=i+1;j<n;++j)
			for(int k=j+1;k<=n;++k){
				//x[i]*y[j]-x[j]*y[i]+x[j]*y[k]-x[k]*y[j]+x[k]*y[i]-x[i]*y[k];
				int r=x[i]*(y[j]-y[k])+x[j]*(y[k]-y[i])+x[k]*(y[i]-y[j]);
				ans+=abs(r);
			}
	printf("%.1lf",ans/2.0);
}
inline void solveBF___()
{
	for(int i=1;i<n-1;++i){
		int xi=0;
		for(int j=i+1;j<n;++j) xi+=y[j]*(n-j)-sy[j+1];
		ans+=x[i]*xi;
	}
	for(int j=2;j<n;++j){
		int xj=0;
		for(int i=1;i<j;++i) xj-=y[i];
		for(int k=j+1;k<=n;++k) xj+=y[k];
		ans+=x[j]*xj;
	}
	for(int k=3;k<=n;++k){
		int xk=0;
		for(int j=2;j<k;++j) xk+=ssy[j-1]-y[j]*(j-1);
		ans+=x[k]*xk;
	}
	printf("%.1lf",abs(ans)/2.0);
}
inline void solveBF()
{
	for(int i=1;i<n-1;++i)
		for(int j=i+1;j<n;++j){
			int dij=d[i][j];
			for(int k=j+1;k<=n;++k) ans+=abs(dij+d[j][k]+d[k][i]);
		}
	printf("%.1lf",ans/2.0);
}
signed main()
{
	n=read();
	for(int i=1;i<=n;++i){
		x[i]=read();
		y[i]=read();
	}
	for(int i=n;i>=1;--i) sy[i]=sy[i+1]+y[i];
	for(int i=1;i<=n;++i) ssy[i]=ssy[i-1]+y[i];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j) d[i][j]=x[i]*y[j]-x[j]*y[i];
	if(n<=2000) solveBF();
	else solveBF__();
	return 0;
}

求大佬们告诉我,代码效率怎么优化?

你可以看下这帖子(三级一段大佬好牛!虽然我三级四段
这个

1 个赞