NOIP 2017 奶酪

题目链接

https://www.luogu.org/problemnew/show/P3958

去年貌似只拿了30分

现在24分钟AC掉了

还是有进步的

注意在考场上自己出一些特殊的数据来测

比如这道题在一个球同时切上下的时候我的程序就有bug

WA了一次

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std;

typedef long long ll;
const int MAXN = 1e3 + 10;
struct node
{
    ll x, y, z;
    int p;
    void read() { scanf("%lld%lld%lld", &x, &y, &z); }
}a[MAXN];
int n, vis[MAXN];
int h, r;
vector<int> g[MAXN];

inline bool judge(int i, int j)
{
    return 2.0 * r >= sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].z-a[j].z)*(a[i].z-a[j].z));
}

void dfs(int u)
{
    vis[u] = 1;
    REP(i, 0, g[u].size())
    {
        int v = g[u][i];
        if(!vis[v]) dfs(v);
    }
}

int main()
{
    int T; 
    scanf("%d", &T);
    
    while(T--)
    {
        bool ok = false;
        scanf("%d%d%d", &n, &h, &r);
        _for(i, 1, n) 
        {
            a[i].read();
            a[i].p = 0;
            if(a[i].z - r <= 0) a[i].p = 1;
            if(a[i].z + r >= h) 
            {
                if(a[i].p) ok = true;
                a[i].p = 2;
            }
            g[i].clear();
        }
        
        if(ok) { puts("Yes"); continue; }
        
        _for(i, 1, n)
            _for(j, 1, n)
                if(judge(i, j))
                {
                    g[i].push_back(j);
                    g[j].push_back(i);
                }
        
        memset(vis, 0, sizeof(vis));        
        _for(i, 1, n)
            if(!vis[i] && a[i].p == 1)
                dfs(i);
        
        _for(i, 1, n)
        {
            if(a[i].p == 2 && vis[i]) { puts("Yes"); break; };
            if(i == n) puts("No");
        }
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sugewud/p/9880877.html
今日推荐