[bzoj3210] 花神的浇花集会
根据网上题解可得(QAQ。。把坐标变成(x-y,x+y)后,原本的切比雪夫距离就是现在的曼哈顿距离的一半。。
似乎金组题里也有道一模一样的。
分别求出横纵坐标的中位数。。但如果所取的点的x、y奇偶性不同。。那在原图里是没有对应点的。
所以可能要再试一下旁边的四个点
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstdlib> 6 #define ll long long 7 using namespace std; 8 const int maxn=100233; 9 int x[maxn],y[maxn]; 10 int i,j,k,n,m; 11 ll ans; 12 int ra;char rx; 13 inline int read(){ 14 rx=getchar(),ra=0; 15 while(rx<'0'||rx>'9')rx=getchar(); 16 while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; 17 } 18 inline ll get(int a,int b){ 19 ll sm=0; 20 for(int i=1;i<=n;i++) 21 sm+=abs(a-x[i])+abs(b-y[i]); 22 return sm; 23 } 24 int main(){ 25 n=read(); 26 for(i=1;i<=n;i++)j=read(),k=read(),x[i]=j+k,y[i]=j-k; 27 sort(x+1,x+1+n),sort(y+1,y+1+n); 28 int mx=x[(1+n)>>1],my=y[(1+n)>>1]; 29 if((mx^my)&1) 30 ans=min(get(mx-1,my),min(get(mx+1,my),min(get(mx,my-1),get(mx,my+1)))); 31 else ans=get(mx,my); 32 printf("%lld\n",ans>>1); 33 return 0; 34 }