I. Disks
题解
对于一组相切的圆来说,其中一个圆变大,其相邻的圆变小,然后相邻的相邻的圆变大...而要让总半径和变小,一定得是总的变小的圆更多
实施
先判断一组圆能不能发生变化,然后再累积变大和变小的圆个数
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=2e14;
struct node
{
ll x,y,r;
}c[1005];
vector<ll> G[1005];
ll vis[1005]={0};
inline void read(ll &x) {
x = 0;
ll flag = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-')flag = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
x *= flag;
}
inline void write(ll x)
{
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
ll res=0;
void dfs(ll now, ll fa, ll op)
{
res+=op;
vis[now]=op;
for(auto next:G[now])
{
if(next==fa) continue;
if(!vis[next])
{
dfs(next,now,-op);
}
else if(vis[next]==vis[now]) res+=inf;
}
}
int main()
{
ll n;
read(n);
for(ll i=1; i<=n; i++)
{
read(c[i].x);
read(c[i].y);
read(c[i].r);
}
for(ll i=1; i<=n; i++)
{
for(ll j=1; j<i; j++)
{
ll x1=c[i].x, x2=c[j].x, y1=c[i].y, y2=c[j].y, r1=c[i].r, r2=c[j].r;
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(r1+r2)*(r1+r2))
{
G[i].push_back(j);
G[j].push_back(i);
}
}
}
for(ll i=1; i<=n; i++)
{
if(!vis[i])
{
res=0;
dfs(i,i,1);
if(res&&res<=n)
{
puts("YES");
return 0;
}
}
}
puts("NO");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步