Submission #884246

#TimeUsernameProblemLanguageResultExecution timeMemory
884246noiaintPaint (COI20_paint)C++17
17 / 100
1739 ms27152 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif #define file "" #define mp make_pair #define fi first #define se second #define all(x) x.begin(), x.end() #define bit(x) (1LL << (x)) #define getbit(x, i) (((x) >> (i)) & 1) #define popcount __builtin_popcountll mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return l + rd() % (r - l + 1); } const int N = 1e6 + 5; const int mod = (int)1e9 + 7; // 998244353; const int lg = 25; // lg + 1 const int oo = 1e9; const long long ooo = 1e18; template<class X, class Y> bool mini(X &a, Y b) { return a > b ? (a = b, true) : false; } template<class X, class Y> bool maxi(X &a, Y b) { return a < b ? (a = b, true) : false; } void add(int &a, int b) { a += b; if (a >= mod) a -= mod; if (a < 0) a += mod; } const int dx[] = {1, 0, -1, 0}; const int dy[] = {0, 1, 0, -1}; int m, n, q; vector<vector<int> > a; namespace task1 { bool check() { return m * n <= 10000 && q <= 10000; } bool inside(int x, int y) { return 1 <= x && x <= m && 1 <= y && y <= n; } void Paint(int Ax, int Ay, int NewColor) { vector<vector<int> > vis(m + 5, vector<int> (n + 5, 0)); queue<pair<int,int> > Q; Q.push({Ax, Ay}); vis[Ax][Ay] = true; int FirstColor = a[Ax][Ay]; a[Ax][Ay] = NewColor; while (Q.size()) { int x, y; tie(x, y) = Q.front(); Q.pop(); for (int k = 0; k < 4; ++k) { int nx = x + dx[k]; int ny = y + dy[k]; if (!vis[nx][ny] && inside(nx, ny) && a[nx][ny] == FirstColor) { a[nx][ny] = NewColor; vis[nx][ny] = true; Q.push({nx, ny}); } } } } void solve() { while (q--) { int x, y, NewColor; cin >> x >> y >> NewColor; Paint(x, y, NewColor); } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) cout << a[i][j] << ' '; cout << '\n'; } } } namespace task2 { bool check() { return m == 1; } struct SegMax { vector<int> maxval, lazy, rec; int n; void init(int _n) { n = _n; maxval.assign(n * 4 + 5, 0); lazy.assign(n * 4 + 5, 0); rec.assign(n * 4 + 5, 0); } void down(int i) { if (!rec[i]) return; for (int j = i * 2; j <= i * 2 + 1; ++j) maxval[j] = lazy[j] = lazy[i], rec[j] = true; rec[i] = false; } void update(int i, int L, int R, int l, int r, int c) { if (r < L || l > R) return; if (l <= L && R <= r) { maxval[i] = c; lazy[i] = c; rec[i] = true; return; } down(i); int M = (L + R) >> 1; update(i << 1, L, M, l, r, c); update(i << 1 | 1, M + 1, R, l, r, c); maxval[i] = max(maxval[i << 1], maxval[i << 1 | 1]); } int get(int i, int L, int R, int l, int r) { if (r < L || l > R) return -oo; if (l <= L && R <= r) return maxval[i]; down(i); int M = (L + R) >> 1; return max(get(i << 1, L, M, l, r), get(i << 1 | 1, M + 1, R, l, r)); } void update(int l, int r, int c) { update(1, 1, n, l, r, c); } int get(int l, int r) { return get(1, 1, n, l, r); } } Tmax; struct SegMin { vector<int> minval, lazy, rec; int n; void init(int _n) { n = _n; minval.assign(n * 4 + 5, 0); lazy.assign(n * 4 + 5, 0); rec.assign(n * 4 + 5, 0); } void down(int i) { if (!rec[i]) return; for (int j = i * 2; j <= i * 2 + 1; ++j) minval[j] = lazy[j] = lazy[i], rec[j] = true; rec[i] = false; } void update(int i, int L, int R, int l, int r, int c) { if (r < L || l > R) return; if (l <= L && R <= r) { minval[i] = c; lazy[i] = c; rec[i] = true; return; } down(i); int M = (L + R) >> 1; update(i << 1, L, M, l, r, c); update(i << 1 | 1, M + 1, R, l, r, c); minval[i] = min(minval[i << 1], minval[i << 1 | 1]); } int get(int i, int L, int R, int l, int r) { if (r < L || l > R) return oo; if (l <= L && R <= r) return minval[i]; down(i); int M = (L + R) >> 1; return min(get(i << 1, L, M, l, r), get(i << 1 | 1, M + 1, R, l, r)); } void update(int l, int r, int c) { update(1, 1, n, l, r, c); } int get(int l, int r) { return get(1, 1, n, l, r); } } Tmin; void solve() { Tmax.init(n); Tmin.init(n); for (int i = 1; i <= n; ++i) { Tmax.update(i, i, a[1][i]); Tmin.update(i, i, a[1][i]); } while (q--) { int x, NewColor; cin >> x >> x >> NewColor; int lpos, rpos; int l = 1, r = x; int res = x; while (l <= r) { int mid = (l + r) / 2; int curmax = Tmax.get(mid, x); int curmin = Tmin.get(mid, x); if (curmax == curmin) { res = mid; r = mid - 1; } else l = mid + 1; } lpos = res; l = x, r = n; res = x; while (l <= r) { int mid = (l + r) / 2; int curmax = Tmax.get(x, mid); int curmin = Tmin.get(x, mid); if (curmax == curmin) { res = mid; l = mid + 1; } else r = mid - 1; } rpos = res; Tmax.update(lpos, rpos, NewColor); Tmin.update(lpos, rpos, NewColor); } for (int i = 1; i <= n; ++i) cout << Tmax.get(i, i) << ' '; } } void process() { cin >> m >> n; a.resize(m + 5, vector<int>(n + 5, 0)); for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) cin >> a[i][j]; cin >> q; if (task1::check()) {task1::solve(); return;} if (task2::check()) {task2::solve(); return;} // task1::solve(); } int main() { ios::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #else // freopen(file".inp", "r", stdin); // freopen(file".out", "w", stdout); #endif int tc = 1; // cin >> tc; while (tc--) { process(); } return 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...