有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
标签:show bbs long ack bool 技术分享 stat div EDA
有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1。现在N个松鼠要走到一个松鼠家去,求走过的最短距离。
第一行给出数字N,表示有多少只小松鼠。0<=N<=10^5
下面N行,每行给出x,y表示其家的坐标。
-10^9<=x,y<=10^9
表示为了聚会走的路程和最小为多少。
1 2 #include<cstdio> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<queue> 7 #include<cmath> 8 #include<vector> 9 #include<stack> 10 #include<map> 11 #define Run(i,l,r) for(int i=l;i<=r;i++) 12 #define Don(i,l,r) for(int i=l;i>=r;i--) 13 #define ll long long 14 #define inf 0x3f3f3f3f 15 using namespace std; 16 const int N=100010; 17 int n,px[N],py[N]; 18 ll upx[N],dnx[N],upy[N],dny[N]; 19 struct data{ 20 int x,id; 21 bool operator <(const data&A)const{ 22 return x<A.x; 23 } 24 }X[N],Y[N]; 25 int main(){ 26 // freopen("bzoj3170.in","r",stdin); 27 // freopen("bzoj3170.out","w",stdout); 28 scanf("%d",&n); 29 for(int i=1;i<=n;i++){ 30 int a,b; 31 scanf("%d%d",&a,&b); 32 X[i]=(data){a-b,i}; 33 Y[i]=(data){a+b,i}; 34 } 35 sort(X+1,X+n+1); 36 sort(Y+1,Y+n+1); 37 for(int i=1;i<=n;i++){ 38 px[X[i].id]=i; 39 py[Y[i].id]=i; 40 } 41 ll ans=1e18; 42 for(int i=1;i<=n;i++){ 43 upx[i]=upx[i-1]+1ll*(i-1)*(X[i].x-X[i-1].x); 44 upy[i]=upy[i-1]+1ll*(i-1)*(Y[i].x-Y[i-1].x); 45 } 46 for(int i=n;i;i--){ 47 dnx[i]=dnx[i+1]+1ll*(n-i)*(X[i+1].x-X[i].x); 48 dny[i]=dny[i+1]+1ll*(n-i)*(Y[i+1].x-Y[i].x); 49 } 50 for(int i=1;i<=n;i++){ 51 ans=min(ans,upx[px[i]]+dnx[px[i]]+upy[py[i]]+dny[py[i]]); 52 } 53 printf("%lld\n",ans>>1); 54 return 0; 55 }//by tkys_Austin;
标签:show bbs long ack bool 技术分享 stat div EDA
原文地址:https://www.cnblogs.com/Paul-Guderian/p/9814343.html