原題連結
題解
對於一組相切的圓來說,其中一個圓變大,其相鄰的圓變小,然後相鄰的相鄰的圓變大...而要讓總半徑和變小,一定得是總的變小的圓更多
實施
先判斷一組圓能不能發生變化,然後再累積變大和變小的圓個數
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;
}