Submission #258844

#TimeUsernameProblemLanguageResultExecution timeMemory
258844amoo_safarHamburg Steak (JOI20_hamburg)C++17
15 / 100
567 ms76856 KiB
// Zende bad Shoma nasime faghat ! #include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef long long ll; typedef long double ld; typedef string str; typedef pair<ll, ll> pll; typedef pair<int, int> pii; const ll Mod = 1000000007LL; const int N = 2e5 + 10; const ll Inf = 2242545357980376863LL; const ll Log = 30; int n, k; int L[N], R[N], U[N], D[N]; vector<int> uX, uY; vector<pii> points; void Done(){ while((int) points.size() < k) points.pb(pii(0, 0)); for(auto x : points) printf("%d %d\n", uX[x.F], uY[x.S]); exit(0); } int mk[N]; bool In(pii P, int id){ return L[id] <= P.F && P.F <= R[id] && D[id] <= P.S && P.S <= U[id]; } void On(pii P, int col){ for(int i = 0; i < n; i++){ if(L[i] <= P.F && P.F <= R[i] && D[i] <= P.S && P.S <= U[i] && !mk[i]) mk[i] = col; } points.pb(P); } void Off(int col){ for(int i = 0; i < n; i++) if(mk[i] == col) mk[i] = 0; points.pop_back(); } void Solve(int y){ if(y == 0){ for(int i = 0; i < n; i++) if(!mk[i]) return ; } int mnx = N, mxx = -1; for(int i = 0; i < n; i++) if(!mk[i]) mnx = min(mnx, R[i]), mxx = max(mxx, L[i]); if(mxx == -1){ for(int i = 0; i < y; i++) points.pb(pii(0, 0)); Done(); } int mny = N, mxy = -1; for(int i = 0; i < n; i++) if(!mk[i]) mny = min(mny, U[i]), mxy = max(mxy, D[i]); for(int px : {mnx, mxx}){ for(int py : {mny, mxy}){ On({px, py}, y); Solve(y - 1); Off(y); } } } const int N2 = N * 4; vector<int> O[N2], I[N2]; void AddE(int u, int v){ O[u].pb(v); I[v].pb(u); } void AddC(int u, int v){ //if(u == v); AddE(u ^ 1, v); AddE(v ^ 1, u); } void Ban(int u, int v){ AddC(u ^ 1, v ^ 1); } int mark[N2]; vector<int> top; void DFS(int u){ mark[u] = 1; for(auto adj : O[u]) if(!mark[adj]) DFS(adj); top.pb(u); } void DFS(int u, int c){ mark[u] = c; for(auto adj : I[u]) if(!mark[adj]) DFS(adj, c); } bool isst[N]; void Main(){ int mnx = N, mxx = -1; for(int i = 0; i < n; i++) if(!mk[i]) mnx = min(mnx, R[i]), mxx = max(mxx, L[i]); int mny = N, mxy = -1; for(int i = 0; i < n; i++) if(!mk[i]) mny = min(mny, U[i]), mxy = max(mxy, D[i]); vector<pii> po; vector<int> ln; { // Nodes int st = 0; for(int i = mxx + 1; i < mnx; i++) po.pb({i, mny}); isst[st] = true; for(int i = st; i + 1 < (int) po.size(); i++) Ban(i << 1 | 1, (i + 1) << 1); st = po.size(); ///////////////////// for(int i = mxx + 1; i < mnx; i++) po.pb({i, mxy}); isst[st] = true; for(int i = st; i + 1 < (int) po.size(); i++) Ban(i << 1 | 1, (i + 1) << 1); st = po.size(); ///////////////////// for(int i = mxy + 1; i < mny; i++) po.pb({mnx, i}); isst[st] = true; for(int i = st; i + 1 < (int) po.size(); i++) Ban(i << 1 | 1, (i + 1) << 1); st = po.size(); ///////////////////// for(int i = mxy + 1; i < mny; i++) po.pb({mxx, i}); isst[st] = true; for(int i = st; i + 1 < (int) po.size(); i++) Ban(i << 1 | 1, (i + 1) << 1); st = po.size(); } int m = po.size(); for(int i = 0; i < m; i++) if(isst[i]) ln.pb(i); ln.pb(m); assert(ln.size() == 5); int fst, la; vector<pii> seg; for(int i = 0; i < n; i++){ seg.clear(); for(int j = 0; j < 4; j++){ fst = -1; la = -1; for(int l = ln[j]; l < ln[j + 1]; l++){ if(In(po[l], i)){ la = l; if(fst == -1) fst = l; } } if(fst == -1) continue; seg.pb({fst, la}); } if(seg.empty() || seg.size() > 2) continue; if(seg.size() == 1){ AddC(seg[0].S << 1 | 1, seg[0].S << 1 | 1); if(!isst[seg[0].F]) AddC((seg[0].F - 1) << 1, (seg[0].F - 1) << 1); } else { vector<int> B[2]; for(int j = 0; j < 2; j++){ B[j].pb(seg[j].S << 1 | 0); if(!isst[seg[j].F]) B[j].pb((seg[j].F - 1) << 1 | 1); } for(int b1 : B[0]) for(int b2 : B[1]) Ban(b1, b2); } } for(int i = 0; i < m + m; i++){ if(!mk[i]) DFS(i); } reverse(all(top)); memset(mark, 0, sizeof mark); int cnt = 1; for(auto x : top) if(!mark[x]){ DFS(x, cnt); cnt ++; } vector<int> val(m, 0); for(int i = 0; i < m; i++) val[i] = (mark[i + i] < mark[i + i + 1] ? 1 : 0); for(int j = 0; j < 4; j++){ for(int l = ln[j]; l < ln[j + 1]; l++){ if(val[l]){ points.pb(po[l]); break; } } } Done(); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); scanf("%d%d", &n, &k); for(int i = 0; i < n; i++) scanf("%d%d%d%d", L + i, D + i, R + i, U + i); for(int i = 0; i < n; i++) uX.pb(L[i]), uY.pb(D[i]), uX.pb(R[i]), uY.pb(U[i]); sort(all(uX)); uX.resize(unique(all(uX)) - uX.begin()); sort(all(uY)); uY.resize(unique(all(uY)) - uY.begin()); for(int i = 0; i < n; i++){ L[i] = lower_bound(all(uX), L[i]) - uX.begin(); R[i] = lower_bound(all(uX), R[i]) - uX.begin(); U[i] = lower_bound(all(uY), U[i]) - uY.begin(); D[i] = lower_bound(all(uY), D[i]) - uY.begin(); } //assert(k <= 3); Solve(k); assert(k == 4); Main(); return 0; } /* 4 4 1 4 1 4 2 1 2 1 3 0 3 0 4 3 4 3 */

Compilation message (stderr)

hamburg.cpp: In function 'int main()':
hamburg.cpp:224:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  224 |  scanf("%d%d", &n, &k);
      |  ~~~~~^~~~~~~~~~~~~~~~
hamburg.cpp:225:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  225 |  for(int i = 0; i < n; i++) scanf("%d%d%d%d", L + i, D + i, R + i, U + 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...