Submission #55211

#TimeUsernameProblemLanguageResultExecution timeMemory
55211sebinkim절취선 (JOI14_ho_t5)C++14
40 / 100
642 ms62544 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; vector <ll> X, Y; vector <pll> LX[202020], LY[202020]; vector <pll> PX[202020], PY[202020], Z[202020]; vector <pll> K; vector <ll> L[202020], P[202020]; set <pll> S; ll A[202020], B[202020], C[202020], D[202020]; ll T[606060], U[202020]; ll n, v, e, w, h, sz; ll find(ll p) { return p == U[p]? p : U[p] = find(U[p]); } void group(ll a, ll b) { U[find(a)] = find(b); } void insert(ll p, ll v) { p += sz; for(;p;p>>=1) T[p] += v; } ll get_sum(ll l, ll r) { ll ret = 0; l += sz, r += sz; for(;l<r;){ if(l & 1) ret += T[l]; if(~r & 1) ret += T[r]; l = l+1 >> 1; r = r-1 >> 1; } if(l == r) ret += T[l]; return ret; } ll intersects(vector <pll> *E, vector <pll> *V, ll x) { ll i, ret = 0; for(i=0;i<=x;i++){ for(auto j: V[i]) insert(j.first, j.second); for(auto j: E[i]) ret += get_sum(j.first + 1, j.second - 1); } return ret; } int main() { ll i, a, b, c, d; scanf("%lld%lld%lld", &w, &h, &n); X.push_back(0); Y.push_back(0); X.push_back(w); Y.push_back(h); for(i=1;i<=n;i++){ scanf("%lld%lld%lld%lld", A+i, B+i, C+i, D+i); X.push_back(A[i]); Y.push_back(B[i]); X.push_back(C[i]); Y.push_back(D[i]); } n ++; A[n] = 0, B[n] = 0, C[n] = w, D[n] = 0; n ++; A[n] = 0, B[n] = h, C[n] = w, D[n] = h; n ++; A[n] = 0, B[n] = 0, C[n] = 0, D[n] = h; n ++; A[n] = w, B[n] = 0, C[n] = w, D[n] = h; sort(X.begin(), X.end()); X.erase(unique(X.begin(), X.end()), X.end()); sort(Y.begin(), Y.end()); Y.erase(unique(Y.begin(), Y.end()), Y.end()); for(sz=1;sz<X.size() && sz<Y.size();sz<<=1); for(i=1;i<=n;i++){ a = lower_bound(X.begin(), X.end(), A[i]) - X.begin(); b = lower_bound(Y.begin(), Y.end(), B[i]) - Y.begin(); c = lower_bound(X.begin(), X.end(), C[i]) - X.begin(); d = lower_bound(Y.begin(), Y.end(), D[i]) - Y.begin(); if(a == c){ LX[a].push_back(pll(b, d)); PY[b].push_back(pll(a, 1)); PY[d+1].push_back(pll(a, -1)); if(b+1 <= d){ Z[b+1].push_back(pll(a, 1)); Z[d].push_back(pll(a, -1)); } } else{ LY[b].push_back(pll(a, c)); PX[a].push_back(pll(b, 1)); PX[c+1].push_back(pll(b, -1)); } K.push_back(pll(a, b)); K.push_back(pll(c, d)); } sort(K.begin(), K.end()); K.erase(unique(K.begin(), K.end()), K.end()); v = K.size() + intersects(LY, Z, (ll)Y.size()); e = n + intersects(LX, PX, (ll)X.size()) + intersects(LY, PY, (ll)Y.size()); if(e > 5000000){ printf("%lld\n", e - v + 1); return 0; } for(i=1;i<=n;i++){ A[i] = a = lower_bound(X.begin(), X.end(), A[i]) - X.begin(); B[i] = b = lower_bound(Y.begin(), Y.end(), B[i]) - Y.begin(); C[i] = c = lower_bound(X.begin(), X.end(), C[i]) - X.begin(); D[i] = d = lower_bound(Y.begin(), Y.end(), D[i]) - Y.begin(); U[i] = i; if(a == c) L[a].push_back(i); else{ P[a].push_back(i); P[c+1].push_back(-i); } } for(i=0;i<=X.size();i++){ for(auto j: P[i]){ if(j < 0) S.erase(pll(B[-j], -j)); else S.insert(pll(B[j], j)); } for(auto j: L[i]){ auto it1 = S.lower_bound(pll(B[j], 0)); auto it2 = S.lower_bound(pll(D[j], 1e9)); for(; it1 != it2; it1++){ group(j, it1 -> second); } } } c = 0; for(i=1;i<=n;i++) c += (i == U[i]); printf("%lld\n", e - v + c ); return 0; }

Compilation message (stderr)

2014_ho_t5.cpp: In function 'll get_sum(ll, ll)':
2014_ho_t5.cpp:37:8: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   l = l+1 >> 1;
       ~^~
2014_ho_t5.cpp:38:8: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
   r = r-1 >> 1;
       ~^~
2014_ho_t5.cpp: In function 'int main()':
2014_ho_t5.cpp:82:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(sz=1;sz<X.size() && sz<Y.size();sz<<=1);
           ~~^~~~~~~~~
2014_ho_t5.cpp:82:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(sz=1;sz<X.size() && sz<Y.size();sz<<=1);
                          ~~^~~~~~~~~
2014_ho_t5.cpp:136:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0;i<=X.size();i++){
          ~^~~~~~~~~~
2014_ho_t5.cpp:61:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld%lld", &w, &h, &n);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
2014_ho_t5.cpp:67:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld%lld", A+i, B+i, C+i, D+i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...