我都开__int128了怎么还是80分?
查看原帖
我都开__int128了怎么还是80分?
457002
szhl0803楼主2022/9/11 12:48

我的做法和我下面的帖子一样。

//P3958 [NOIP2017 提高组] 奶酪
#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
int n,h,r;
const int N=1005;
struct node
{
	ll x,y,z;
}p[1005];
vector<int>to[N];
bool nl[N];//与上表面相交
bool ml[N];//与下表面相交
bool vis[N],flag;
ll check(int a,int b,int r)//就是这里
{
	ll disq=(p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y)
	+(p[a].z-p[b].z)*(p[a].z-p[b].z);
	r*=2;
	if(disq<=r*r)return 1;
	else return 0;
}
void input()
{
	memset(nl,0,sizeof nl);
	memset(ml,0,sizeof ml);
	memset(vis,0,sizeof vis);
	flag=0;
	for(int i=0;i<N;i++)to[i].clear();
	scanf("%d%d%d",&n,&h,&r);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
		if(p[i].z+r>=h)nl[i]=1;
		if(p[i].z-r<=0)ml[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i!=j&&check(i,j,r))
			{
				to[i].push_back(j);
				//printf("%d->%d\n",i,j);
			}
		}
	}
	//cout<<"------------------\n";
}
void dfs(int u)
{
	if(ml[u])return void(flag=1);
	vis[u]=1; 
	for(int v:to[u])
	{
		if(!vis[v])
		dfs(v);
	}
}
void work()
{
	input();
	for(int i=1;i<=n;i++)
	if(!flag&&nl[i])dfs(i);
	printf(flag?"Yes\n":"No\n");
}
int main()
{
	#ifndef ONLINE_JUDGE
	freopen("1.in","r",stdin);
	#endif
	int t;cin>>t;
	while(t--)
	{
		work();
	}
}
2022/9/11 12:48
加载中...