求助站外题
  • 板块学术版
  • 楼主xiaofu15191
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/10 17:23
  • 上次更新2023/11/3 04:40:22
查看原帖
求助站外题
242317
xiaofu15191楼主2023/8/10 17:23

电缆建设,见Vijos P1466,但是在我们OJ上,TLE80,有一个点一直过不去,本地656ms,OJ上一直1100ms+啊啊啊啊啊

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
inline int read()
{
	register int sum=0,xishu=1;
	char t=getchar();
	while(t<'0'||t>'9')
	{
		if(t=='-') xishu=-1;
		t=getchar();
	}
	while(t>='0'&&t<='9')
	{
		sum=sum*10+t-'0';
		t=getchar();
	}
	return sum*xishu;
}
inline double dis_calculate(register int x_1,register int y_1,register int x_2,register int y_2)
{
	// if(x_1==x_2&&y_1==y_2) return 0;
	return sqrt((x_1-x_2)*(x_1-x_2)+(y_1-y_2)*(y_1-y_2));
}
struct edge
{
	int from,to;
	double v;
};
inline bool cmp(edge t1,edge t2)
{
	return t1.v<t2.v;
}
edge edges[3000010];
int n,m,x_1,x_2,y_1[600010],y_2[600010],father[1200010],cnt;
inline int find(register int x)
{
	if(father[x]==x) return x;
	else return father[x]=find(father[x]);
}
inline void unionn(register int x,register int y)
{
	father[y]=x;
}
int main()
{
	n=read();
	m=read();
	x_1=read();
	x_2=read();
	for(register int i=1;i<=n;i++)
	{
		y_1[i]=read();
		y_1[i]+=y_1[i-1];
	}
	for(register int i=1;i<=m;i++)
	{
		y_2[i]=read();
		y_2[i]+=y_2[i-1];
	}
	for(register int i=1;i<=n+m;i++) father[i]=i;
	for(register int i=1;i<n;i++)
		edges[++cnt]=edge{i,i+1,dis_calculate(x_1,y_1[i],x_1,y_1[i+1])};
	for(register int i=1;i<m;i++)
		edges[++cnt]=edge{i+n,i+n+1,dis_calculate(x_2,y_2[i],x_2,y_2[i+1])};
	register int tmp1=1,tmp2=1;
	while(tmp1<=n)
	{
		while(tmp2<m&&y_2[tmp2]<y_1[tmp1])
			tmp2++;
		edge t1=edge{tmp1,tmp2+n,dis_calculate(x_1,y_1[tmp1],x_2,y_2[tmp2])},t2=edge{tmp1,tmp2+n-1,dis_calculate(x_1,y_1[tmp1],x_2,y_2[tmp2-1])};
		edges[++cnt]=t1;
		if(tmp2>1)
			edges[++cnt]=t2;
		tmp1++;
	}
	sort(edges+1,edges+cnt+1,cmp);

	register double ans=0;
	for(register int i=1;i<=cnt;i++)
	{
		register int from=find(edges[i].from),to=find(edges[i].to);
		double v=edges[i].v;
		if(from!=to)
		{
			unionn(from,to);
			ans+=v;
		}
	}
	printf("%.2lf\n",ans);
}

(虽然inline和register其实没啥用,但是在我们OJ上可能玄学的有用?)

分析发现,sort在本地跑了500ms左右,在我们OJ上要跑850ms左右......而且空限64MB,快读我也不会在这个空限内改写成fread版......

2023/8/10 17:23
加载中...