제출 #1250565

#제출 시각아이디문제언어결과실행 시간메모리
1250565wedonttalkanymorePark (BOI16_park)C++20
100 / 100
387 ms84944 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int long long #define pii pair<ll, ll> #define fi first #define se second const ll N = 1e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 1 << 16; int n, m; int w, h; int par[N], sz[N]; double length[2005][2005]; string ans[N]; int id[5]; pii corner[4] = {{0, 0}, {w, 0}, {w, h}, {0, h}}; struct circle { int x, y, r, id; } a[N]; struct visitor { int r, e, id; } v[N]; struct item { int x, y; double w; }; double cal(circle a, circle b) { double val = 1.0 * sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)) - (a.r + b.r); return max(val, 0.0); } void makeset() { for (int i = 1; i <= n + 4; i++) { par[i] = i; sz[i] = 1; } } int find(int u) { if (u == par[u]) return u; return par[u] = find(par[u]); } void join(int u, int v) { u = find(u), v = find(v); if (u != v) { if (sz[u] < sz[v]) swap(u, v); sz[u] += sz[v]; par[v] = u; } } bool check(int u, int v) { u = find(u); v = find(v); return (u != v); } vector <item> have; bool cmp(item a, item b) { return a.w < b.w; } bool cmp2(visitor a, visitor b) { return a.r < b.r; } signed main() { ios::sync_with_stdio(false); cin.tie(0); if (fopen(".inp", "r")) { freopen(".inp", "r", stdin); freopen(".out", "w", stdout); } cin >> n >> m >> w >> h; makeset(); for (int i = 1; i <= n; i++) { cin >> a[i].x >> a[i].y >> a[i].r; a[i].id = i; } for (int i = 1; i <= m; i++) { cin >> v[i].r >> v[i].e; v[i].id = i; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { length[i][j] = length[j][i] = cal(a[i], a[j]); have.push_back({i, j, length[i][j]}); } length[i][n + 1] = max(0.0, double(h - a[i].y - a[i].r)); // tren length[i][n + 2] = max(0.0, double(w - a[i].x - a[i].r)); // phai length[i][n + 3] = max(0.0, double(a[i].y - a[i].r)); // duoi length[i][n + 4] = max(0.0, double(a[i].x - a[i].r)); // trai have.push_back({i, n + 1, length[i][n + 1]}); have.push_back({i, n + 2, length[i][n + 2]}); have.push_back({i, n + 3, length[i][n + 3]}); have.push_back({i, n + 4, length[i][n + 4]}); } sort(have.begin(), have.end(), cmp); sort(v + 1, v + m + 1, cmp2); int pointer = 0; for (int i = 1; i <= m; i++) { while(pointer < have.size() && have[pointer].w < 2.00 * v[i].r) { join(have[pointer].x, have[pointer].y); pointer++; } int e = v[i].e; string s = ""; if (e == 1) { s += "1"; if (check(n + 1, n + 3) && check(n + 4, n + 3) && check(n + 3, n + 2)) s += "2"; if (check(n + 1, n + 3) && check(n + 2, n + 4) && check(n + 1, n + 2) && check(n + 3, n + 4)) s += "3"; if (check(n + 2, n + 4) && check(n + 1, n + 4) && check(n + 3, n + 4)) s += "4"; } if (e == 2) { if (check(n + 1, n + 3) && check(n + 2, n + 3) && check(n + 3, n + 4)) s += "1"; s += "2"; if (check(n + 2, n + 4) && check(n + 2, n + 3) && check(n + 1, n + 2)) s += "3"; if (check(n + 1, n + 3) && check(n + 2, n + 4) && check(n + 1, n + 4) && check(n + 2, n + 3)) s += "4"; } if (e == 3) { if (check(n + 1, n + 3) && check(n + 2, n + 4) && check(n + 1, n + 2) && check(n + 3, n + 4)) s += "1"; if (check(n + 2, n + 4) && check(n + 2, n + 3) && check(n + 1, n + 2)) s += "2"; s += "3"; if (check(n + 1, n + 3) && check(n + 1, n + 4) && check(n + 1, n + 2)) s += "4"; } if (e == 4) { if (check(n + 2, n + 4) && check(n + 1, n + 4) && check(n + 3, n + 4)) s += "1"; if (check(n + 1, n + 3) && check(n + 2, n + 4) && check(n + 1, n + 4) && check(n + 2, n + 3)) s += "2"; if (check(n + 1, n + 3) && check(n + 1, n + 4) && check(n + 1, n + 2)) s += "3"; s += "4"; } ans[v[i].id] = s; } for (int i = 1; i <= m; i++) cout << ans[i] << '\n'; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

park.cpp: In function 'int main()':
park.cpp:80:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
park.cpp:81:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...