题目链接
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; }