记录编号 252839 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2012]最远点 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 3.571 s
提交时间 2016-04-21 09:38:38 内存使用 25.09 MiB
显示代码纯文本
#include<cstdio>

#define maxn 500010

using namespace std;

typedef long long ll;
struct point{
	ll x,y,id;
	void init(){
		scanf("%lld%lld",&x,&y);
	}
}p[maxn<<1];

int n,ans[maxn];

ll sqr(ll x)
{
	return x*x;
}

inline ll Dis(point a,point b)
{
	return sqr(a.x-b.x)+sqr(a.y-b.y);
}


bool cmp(int x,int i,int j)
{
	ll t1=Dis(p[x],p[i]),t2=Dis(p[x],p[j]);
	if(i<x||i>x+n) t1=-t1;
	if(j<x||j>x+n) t2=-t2;
	return t1>t2;
}

void devide(int l,int r,int ll,int rr)
{
	if(l>r) return ;
	int mid=l+r>>1;
	ans[mid]=ll;
	for(int i=ll+1;i<=rr;i++){
		if(cmp(mid,i,ans[mid])) ans[mid]=i;
	}
	devide(l,mid-1,ll,ans[mid]);
	devide(mid+1,r,ans[mid],rr);
}

int main()
{
	freopen("nt2012_dis.in","r",stdin);
	freopen("nt2012_dis.out","w",stdout);
	int T=0;scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			p[i].init();
			p[i].id=i;
			p[i+n]=p[i];
		}
		devide(1,n,1,n+n);
		for(int i=1;i<=n;i++) printf("%d\n",ans[i]>n?ans[i]-n:ans[i]);
	}
	return 0;
}