电缆建设,见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版......