(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #1031763

#TimeUsernameProblemLanguageResultExecution timeMemory
1031763Alihan_8Garden (JOI23_garden)C++17
45 / 100
3101 ms24660 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ar array #define pb push_back #define ln '\n' #define int long long using i64 = long long; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m, d; cin >> n >> m >> d; vector <int> P(n), Q(n), R(m), S(m); for ( int i = 0; i < n; i++ ){ cin >> P[i] >> Q[i]; } for ( int i = 0; i < m; i++ ){ cin >> R[i] >> S[i]; } { // sorting vector <int> p_(m); iota(all(p_), 0); sort(all(p_), [&](int &u, int &v){ return R[u] < R[v]; }); auto _R = R, _S = S; for ( int i = 0; i < m; i++ ){ R[i] = _R[p_[i]]; S[i] = _S[p_[i]]; } p_ = vector <int> (n); iota(all(p_), 0); sort(all(p_), [&](int &u, int &v){ return P[u] < P[v]; }); auto _P = P, _Q = Q; for ( int i = 0; i < n; i++ ){ P[i] = _P[p_[i]]; Q[i] = _Q[p_[i]]; } } if ( m <= 8 ){ // subtask #1 vector <int> v(d * 2, -1), has(d * 2), tv(d * 2, -1); vector <vector<int>> er(d * 2); for ( int i = 0; i < n; i++ ){ tv[Q[i]] = true; has[Q[i]] = true; } for ( int i = 0; i < m; i++ ){ chmax(v[S[i]], R[i]); has[S[i]] = true; } for ( int i = 0; i < d * 2; i++ ){ if ( v[i] != -1 ){ er[v[i]].pb(i); } } int opt = 1e9, mx = *max_element(all(P)), _ip = 0, _ir = 0; for ( int l = 0; l < d; l++ ){ while ( _ip < n && P[_ip] < l ){ chmax(mx, P[_ip] + d); _ip++; } while ( _ir < m && R[_ir] < l ){ auto flag = chmax(v[S[_ir]], R[_ir] + d); if ( flag > 0 ){ er[R[_ir] + d].pb(S[_ir]); } _ir++; } set <int> st; vector <int> lf(d * 2, -1), rg(d * 2, -1); for ( int i = 1; i < d * 2; i++ ){ if ( has[i - 1] > 0 ){ lf[i] = i - 1; } else{ lf[i] = lf[i - 1]; } } for ( int i = (d - 1) * 2; i >= 0; i-- ){ if ( has[i + 1] ){ rg[i] = i + 1; } else{ rg[i] = rg[i + 1]; } } int maxDiff = 0; for ( int i = 0; i < d * 2; i++ ){ if ( has[i] > 0 ){ st.insert(i); if ( rg[i] != -1 ){ chmax(maxDiff, rg[i] - i); } } } auto del = [&](int x){ st.erase(x); if ( lf[x] != -1 ){ rg[lf[x]] = rg[x]; } if ( rg[x] != -1 ){ lf[rg[x]] = lf[x]; } if ( lf[x] != -1 && rg[x] != -1 ){ chmax(maxDiff, rg[x] - lf[x]); } }; for ( int r = l; r <= l + d; r++ ){ for ( auto &y: er[r] ){ if ( tv[y] < 1 ){ del(y); } } if ( r >= mx ){ chmin(opt, (r - l + 1) * min(*st.rbegin() - *st.begin() + 1, d - maxDiff + 1)); /*cout << l << " " << r << " -> " << opt << " maxDiff : " << maxDiff << ln; for ( auto &u: st ) cout << u << ' '; cout << ln; opt = 1e9;*/ } } } cout << opt << ln; return 0; } vector <ar<int,2>> srt; auto a = Q; for ( int i = 0; i < n; i++ ){ srt.pb({Q[i], -1}); } for ( int i = 0; i < m; i++ ){ srt.pb({S[i], i}); a.pb(S[i]); } sort(all(a)); sort(all(srt)); vector <int> p(m); for ( int i = 0; i < n + m; i++ ){ auto [val, j] = srt[i]; if ( j != -1 ) p[j] = i; } vector <vector<int>> er_(d * 2); int opt = 1e9, mx = *max_element(all(P)), _ip = 0; for ( int l = 0; l < d; l++ ){ while ( _ip < n && P[_ip] < l ){ chmax(mx, P[_ip] + d); _ip++; } auto ok = [&](int x){ return x >= 0 && x < n + m; }; int maxDiff = 0; multiset <int> st; vector <int> L_(n + m), R_(n + m); for ( int i = 0; i < n + m; i++ ){ L_[i] = i - 1; R_[i] = i + 1; if ( ok(L_[i]) ){ chmax(maxDiff, a[i] - a[L_[i]]); } if ( ok(R_[i]) ){ chmax(maxDiff, a[R_[i]] - a[i]); } st.insert(a[i]); } for ( int i = 0; i < m; i++ ){ int v = (R[i] < l ? R[i] + d : R[i]); er_[v].pb(i); } auto er = [&](int j){ j = p[j]; st.erase(st.find(a[j])); if ( ok(R_[j]) ){ L_[R_[j]] = L_[j]; } if ( ok(L_[j]) ){ R_[L_[j]] = R_[j]; } if ( ok(L_[j]) && ok(R_[j]) ){ chmax(maxDiff, a[R_[j]] - a[L_[j]]); } }; for ( int r = l; r <= l + d; r++ ){ for ( auto &j: er_[r] ){ er(j); } er_[r].clear(); if ( r >= mx ){ auto tmp = chmin(opt, (r - l + 1) * (min(*st.rbegin() - *st.begin() + 1, d - maxDiff + 1))); /*if ( tmp > 0 ){ cout << l << " " << r << " -> " << opt << " cur len : " << *st.rbegin() - *st.begin() + 1 << " maxDiff : " << maxDiff << ln; for ( auto &u: st ) cout << u << ' '; cout << ln; }*/ } } } cout << opt; cout << '\n'; } /* Wrong Answer on Test : 2 2 5 4 0 1 1 0 0 2 2 Expected 8 Your out : 4 */

Compilation message (stderr)

garden.cpp: In function 'int main()':
garden.cpp:282:22: warning: unused variable 'tmp' [-Wunused-variable]
  282 |                 auto tmp = chmin(opt, (r - l + 1) * (min(*st.rbegin() - *st.begin() + 1, d - maxDiff + 1)));
      |                      ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...