42分WA了,求HACK
查看原帖
42分WA了,求HACK
180924
FLAT_LCH楼主2022/5/11 17:34
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>

#define inf 1073741824
using namespace std;

struct node1
{
	vector<long long> dui;
	long long k;
	long long x1,y1,x2,y2;
	long long s1,s2,s3,s4;
}a[4000000];
/*
1 2
3 4
*/
struct node
{
	long long x,y,r,id;
}p[1000000];

long long n,len=1;
long long f[1000000]={};

inline long long rd()
{
	long long s=0,w=1;char x='x';
	while(x<'0'||x>'9'){x=getchar();if(x=='-')w=-1;}
	while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
	return s*w;
}

inline bool cmp1(node x,node y)
{
	return ((x.r==y.r)?(x.id<y.id):(x.r>y.r));
}

inline long long newnode(long long x1,long long y1,long long x2,long long y2)
{
	//cout<<len<<"newnode\n";
	len++;
	a[len].x1=x1;
	a[len].y1=y1;
	a[len].x2=x2;
	a[len].y2=y2;
	return len;
}

inline bool outside(long long x1,long long y1,long long x2,long long y2,long long w)
{
	//cout<<(x1>p[w].x)<<endl;
	if(x1>p[w].x)return true;
	if(y1>p[w].y)return true;
	if(x2<p[w].x)return true;
	if(y2<p[w].y)return true;
	//cout<<"false\n";
	return false;
}

long long add(long long u,long long x1,long long y1,long long x2,long long y2,long long w);

inline void xia_chuan(long long u,long long x1,long long y1,long long x2,long long y2,long long w)
{
	//cout<<a[u].s1<<"xia_chuan"<<endl;
	a[u].s1=add(a[u].s1,x1,y1,(x1+x2)/2,(y1+y2)/2,w);
	a[u].s2=add(a[u].s2,(x1+x2)/2+1,y1,x2,(y1+y2)/2,w);
	a[u].s3=add(a[u].s3,x1,(y1+y2)/2+1,(x1+x2)/2,y2,w);
	a[u].s4=add(a[u].s4,(x1+x2)/2+1,(y1+y2)/2+1,x2,y2,w);
}

long long add(long long u,long long x1,long long y1,long long x2,long long y2,long long w)
{
	//cout<<u<<endl;
	if(outside(x1,y1,x2,y2,w))return u;
	//cout<<"add\n";
	if(u==0)
		u=newnode(x1,y1,x2,y2);//,cout<<u<<"u=0\n";
	//else cout<<u<<"u!=0\n";
	a[u].k++;
	//cout<<a[u].k<<endl;
	//a[u].dui=w;
	//cout<<u<<endl;
	if(a[u].k!=1&&a[u].x1!=a[u].x2)
	{
		//cout<<1<<endl;
		xia_chuan(u,x1,y1,x2,y2,w);
		return u;
	}
	a[u].dui.push_back(w);
	return u;
}

inline void readd()
{
	n=rd();
	for(long long i=1;i<=n;i++)
	{
		p[i].x=rd();
		p[i].y=rd();
		p[i].r=rd();
		p[i].id=i;
	}
	sort(p+1,p+1+n,cmp1);
}

inline long long dis(long long x,long long y){return x*x+y*y;}

inline bool jiao(long long u,long long w)
{
	if(dis(a[u].x1-p[w].x,a[u].y1-p[u].y)<=p[w].r*p[w].r)return true;
	if(dis(a[u].x2-p[w].x,a[u].y1-p[u].y)<=p[w].r*p[w].r)return true;
	if(dis(a[u].x1-p[w].x,a[u].y2-p[u].y)<=p[w].r*p[w].r)return true;
	if(dis(a[u].x2-p[w].x,a[u].y2-p[u].y)<=p[w].r*p[w].r)return true;
	if(p[w].x>=a[u].x1&&p[w].x<=a[u].x2)
	{
		if(p[w].y>a[u].y2)
		{
			if(p[w].y-p[w].r<=a[u].y2)
				return true;
		}
		else if(p[w].y<a[u].y1)
		{
			if(p[w].y+p[w].r>=a[u].y1)
				return true;
		}
		else 
			return true;
	}
	if(p[w].y>=a[u].y1&&p[w].y<=a[u].y2)
	{
		if(p[w].x>a[u].x2)
		{
			if(p[w].x-p[w].r<=a[u].x2)
				return true;
		}
		else if(p[w].x<a[u].x1)
		{
			if(p[w].x+p[w].r>=a[u].x1)
				return true;
		}
		else 
			return true;
	}
	return false;
}

void del(long long u,long long w)
{
	if(u==0)return;
	if(!jiao(u,w))return;
	//cout<<u<<' '<<w<<"&&&&&&&&"<<endl;
	for(long long i=0,v;i<a[u].dui.size();i++)
	{
		v=a[u].dui[i];
		if(f[p[v].id]==0&&dis(p[v].x-p[w].x,p[v].y-p[w].y)<=(p[v].r+p[w].r)*(p[v].r+p[w].r))
			f[p[v].id]=p[w].id;
	}
	del(a[u].s1,w);del(a[u].s2,w);del(a[u].s3,w);del(a[u].s4,w);
}

inline void working()
{
	a[1].x1=a[1].y1=-inf;
	a[1].x2=a[1].y2=inf;
	//cout<<a[1].x1<<endl;
	for(long long i=1;i<=n;i++)
		add(1,-inf,-inf,inf,inf,i);
	//cout<<"len="<<len<<endl;
	
	for(long long i=1;i<=n;i++)
		if(f[p[i].id]==0)
			f[p[i].id]=p[i].id,del(1,i);
			
	for(long long i=1;i<=n;i++)
		printf("%lld ",f[i]);
}

int main()
{
	readd();
	working();
	return 0;
}
2022/5/11 17:34
加载中...