Submission #379951

#TimeUsernameProblemLanguageResultExecution timeMemory
379951AriaHPark (BOI16_park)C++11
100 / 100
706 ms109444 KiB
/** I can do this all day **/ #pragma GCC optimize("O2") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define all(x) (x).begin(),(x).end() #define F first #define S second #define Mp make_pair #define SZ(x) (int)x.size() #define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout); const int N = 1e6 + 10; const ll mod = 1e9 + 7; const ll mod2 = 998244353; const ll inf = 8e18; const int LOG = 22; const ld one = 1.; const ld eps = 1e-12; ll pw(ll a , ll b, ll M) { return (!b ? 1 : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M : pw(a * a % M, b / 2, M))); } ll n, m, w, h, X[N], Y[N], R[N], par[N], sz[N]; int get(int x) { return (x == par[x]? x : par[x] = get(par[x])); } void unify(int v, int u) { v = get(v), u = get(u); if(v == u) return; if(sz[u] > sz[v]) swap(u, v); par[u] = v; sz[v] += sz[u]; } pair < pll, int > Q[N]; vector < pair < ld, pll > > E; vector < int > Ans[N]; bool cmp(pair < pll, ll > a, pair < pll, ll > b) { return a.F < b.F; } int ok(int a, int b) { a += n; b += n; return (get(a) == get(b)); } int can(int a, int b) { if(a == b) return 1; if(a > b) swap(a, b); if(a == 1 && b == 2) { return ((ok(1, 2) || ok(2, 4) || ok(2, 3)) == 0); } if(a == 1 && b == 3) { return ((ok(1, 2) || ok(1, 3) || ok(2, 4) || ok(3, 4)) == 0); } if(a == 1 && b == 4) { return ((ok(1, 2) || ok(1, 3) || ok(1, 4)) == 0); } if(a == 2 && b == 3) { return ((ok(1, 3) || ok(2, 3) || ok(4, 3)) == 0); } if(a == 2 && b == 4) { return ((ok(1, 3) || ok(1, 4) || ok(2, 3) || ok(2, 4)) == 0); } else { return ((ok(1, 4) || ok(2, 4) || ok(3, 4)) == 0); } } int main() { for(int i = 0; i < N; i ++) sz[i] = 1, par[i] = i; scanf("%lld%lld%lld%lld", &n, &m, &w, &h); for(int i = 1; i <= n; i ++) { scanf("%lld%lld%lld", &X[i], &Y[i], &R[i]); E.push_back(Mp(X[i] - R[i], Mp(n + 1, i))); E.push_back(Mp(Y[i] - R[i], Mp(n + 2, i))); E.push_back(Mp(w - X[i] - R[i], Mp(n + 3, i))); E.push_back(Mp(h - Y[i] - R[i], Mp(n + 4, i))); for(int j = 1; j < i; j ++) { ll dx = abs(X[i] - X[j]), dy = abs(Y[i] - Y[j]); ll dist = sqrt(dx * dx + dy * dy) - one * R[i] - one * R[j]; E.push_back(Mp(dist, Mp(i, j))); } } sort(all(E)); for(int i = 1; i <= m; i ++) { scanf("%lld%lld", &Q[i].F.F, &Q[i].F.S); Q[i].F.F *= 2; Q[i].S = i; } sort(Q + 1, Q + m + 1, cmp); int last = 0; for(int i = 1; i <= m; i ++) { ///printf("i = %d Q.F : %lld Q.S : %lld\n", i, Q[i].F.F, Q[i].F.S); while(last < SZ(E) && (one * Q[i].F.F - E[last].F) > eps) { unify(E[last].S.F, E[last].S.S); last ++; } for(int j = 1; j <= 4; j ++) { if(can(Q[i].F.S, j)) { Ans[Q[i].S].push_back(j); } } } for(int i = 1; i <= m; i ++) { for(auto x : Ans[i]) { printf("%d", x); } printf("\n"); } return 0; } /** test corner cases(n = 1?) watch for overflow or minus indices **/

Compilation message (stderr)

park.cpp: In function 'int main()':
park.cpp:97:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   97 |  scanf("%lld%lld%lld%lld", &n, &m, &w, &h);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:100:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  100 |   scanf("%lld%lld%lld", &X[i], &Y[i], &R[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:115:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  115 |   scanf("%lld%lld", &Q[i].F.F, &Q[i].F.S);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...