Submission #777404

#TimeUsernameProblemLanguageResultExecution timeMemory
777404NeroZeinSeats (IOI18_seats)C++17
25 / 100
2133 ms65724 KiB
#include "seats.h" #include "bits/stdc++.h" using namespace std; const int N = 1003; int n, m; vector<vector<int>> a; int seg[N + N][N << 1]; void upd (int nd, int l, int r, int p, int v, int ver) { if (l == r) { seg[ver][nd] = v; return; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); if (p <= mid) { upd(nd + 1, l, mid, p, v, ver); } else { upd(rs, mid + 1, r, p, v, ver); } seg[ver][nd] = max(seg[ver][nd + 1], seg[ver][rs]); } int qry (int nd, int l, int r, int s, int e, int ver) { if (l >= s && r <= e) { return seg[ver][nd]; } int mid = (l + r) >> 1; int rs = nd + ((mid - l + 1) << 1); if (mid >= e) { return qry(nd + 1, l, mid, s, e, ver); } else { if (mid < s) { return qry(rs, mid + 1, r, s, e, ver); } else { return max(qry(nd + 1, l, mid, s, e, ver), qry(rs, mid + 1, r, s, e, ver)); } } } int getver (int x, bool col) { return x + n * col; } int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; int Dfs (int mx, int mxr, int mnr, int mxc, int mnc) { //cout << mx << ' ' << mxr << ' ' << mnr << ' ' << mxc << ' ' << mnc << '\n'; int ret = 0; if ((mxr - mnr + 1) * (mxc - mnc + 1) == mx + 1) { ret++; } vector<int> nmxx(4, 1e9); if (mxr + 1 < n) { int nmx = max(mx, qry(0, 0, m - 1, mnc, mxc, getver(mxr + 1, false))); nmxx[0] = nmx; } if (mnr - 1 >= 0) { int nmx = max(mx, qry(0, 0, m - 1, mnc, mxc, getver(mnr - 1, false))); nmxx[1] = nmx; } if (mxc + 1 < m) { int nmx = max(mx, qry(0, 0, n - 1, mnr, mxr, getver(mxc + 1, true))); nmxx[2] = nmx; } if (mnc - 1 >= 0) { int nmx = max(mx, qry(0, 0, n - 1, mnr, mxr, getver(mnc - 1, true))); nmxx[3] = nmx; } int mn = *min_element(nmxx.begin(), nmxx.end()); if (nmxx[0] == mn && mn < 1e9) { ret += Dfs(mn, mxr + 1, mnr, mxc, mnc); } else if (nmxx[1] == mn && mn < 1e9) { ret += Dfs(mn, mxr, mnr - 1, mxc, mnc); } else if (nmxx[2] == mn && mn < 1e9) { ret += Dfs(mn, mxr, mnr, mxc + 1, mnc); } else if (nmxx[3] == mn && mn < 1e9) { ret += Dfs(mn, mxr, mnr, mxc, mnc - 1); } return ret; } vector<int> r, c; void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { n = H, m = W; r = R; c = C; a.resize(n); for (int i = 0; i < n; ++i) { a[i].resize(m); } for (int i = 0; i < n * m; ++i) { a[r[i]][c[i]] = i; upd(0, 0, m - 1, c[i], i, getver(r[i], false)); upd(0, 0, n - 1, r[i], i, getver(c[i], true)); } } int swap_seats(int x, int y) { upd(0, 0, m - 1, c[y], x, getver(r[y], false)); upd(0, 0, n - 1, r[y], x, getver(c[y], true)); upd(0, 0, m - 1, c[x], y, getver(r[x], false)); upd(0, 0, n - 1, r[x], y, getver(c[x], true)); swap(c[x], c[y]); swap(r[x], r[y]); return Dfs(0, r[0], r[0], c[0], c[0]); }
#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...