https://codeforces.com/contest/1455/problem/E
一开始写了个4!套三分套三分套三分,然而跑得巨慢
其实可以只三分一个长度然后贪心找,然而不会推
其实还可以直接贪心就没了
先4!枚举一下每个点最终到达的位置
1 2
3 4
也就是12,34 y坐标要一样 13,24 x坐标要一样,首先我们考虑最终的端点都在他们之间的情况,也就是x方向的长度和y方向的长度的可选范围有重合的情况,那么就是他们之间的差值直接加起来就行了
如果没有,那么就说明需要有一对点一起走,直到有重合位置,那么就是再加上(大的-小的)*2就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,k,cnt,tot,cas;ll ans;
struct node
{
ll x,y;
}a[10],c[10];
int b[10];
bool vis[maxl];
char s[maxl];
inline void prework()
{
for(int i=1;i<=4;i++)
scanf("%lld%lld",&c[i].x,&c[i].y),b[i]=i;
}
inline void mainwork()
{
ans=1ll<<60;
do
{
for(int i=1;i<=4;i++)
a[i]=c[b[i]];
ll tmp=0;
ll lx=min(a[2].x,a[4].x)-max(a[1].x,a[3].x);
ll rx=max(a[2].x,a[4].x)-min(a[1].x,a[3].x);
ll ly=min(a[1].y,a[2].y)-max(a[3].y,a[4].y);
ll ry=max(a[1].y,a[2].y)-min(a[3].y,a[4].y);
tmp+=abs(a[1].x-a[3].x)+abs(a[2].x-a[4].x);
tmp+=abs(a[1].y-a[2].y)+abs(a[3].y-a[4].y);
if(lx>ry)
tmp+=(lx-ry)*2;
else if(ly>rx)
tmp+=(ly-rx)*2;
ans=min(tmp,ans);
}while(next_permutation(b+1,b+1+4));
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}