Submission #1225520

#TimeUsernameProblemLanguageResultExecution timeMemory
1225520badge881Colouring a rectangle (eJOI19_colouring)C++20
100 / 100
320 ms23496 KiB
#include <bits/stdc++.h> using namespace std; const int kN = 2e5; const long long INF = 2e18L; int a[2 * kN], v[1 + kN]; tuple<int, int, int> intervals[2 * kN]; vector<pair<int, int>> rEnd[1 + kN]; void minSelf(long long &x, long long y) { if (y < x) x = y; } struct SegTree { int n; vector<long long> t, lazy; SegTree(int N) : n(N) { int dim = 1; while (dim < n + 1) dim *= 2; dim *= 2; t.resize(dim); lazy.resize(dim); } void push(int x) { if (lazy[x] == 0) return; for (int y = 2 * x; y <= 2 * x + 1; ++y) { t[y] += lazy[x]; lazy[y] += lazy[x]; } lazy[x] = 0; } void rangeAdd(int x, int lx, int rx, int st, int dr, long long v) { if (st <= lx && rx <= dr) { t[x] += v; lazy[x] += v; return; } push(x); int mid = (lx + rx) / 2; if (st <= mid) rangeAdd(x * 2, lx, mid, st, dr, v); if (mid < dr) rangeAdd(x * 2 + 1, mid + 1, rx, st, dr, v); t[x] = min(t[x * 2], t[x * 2 + 1]); } void rangeAdd(int st, int dr, long long v) { rangeAdd(1, 0, n, st, dr, v); } long long query(int x, int lx, int rx, int st, int dr) { if (st <= lx && rx <= dr) return t[x]; push(x); int mid = (lx + rx) / 2; long long ans = INF; if (st <= mid) minSelf(ans, query(x * 2, lx, mid, st, dr)); if (mid < dr) minSelf(ans, query(x * 2 + 1, mid + 1, rx, st, dr)); return ans; } long long query(int st, int dr) { return query(1, 0, n, st, dr); } }; long long solve(int n) { SegTree t(n); for (int i = 1; i <= n; ++i) { t.rangeAdd(i, i, t.query(0, i - 1)); t.rangeAdd(0, i - 1, v[i]); for (auto it : rEnd[i]) { int start, cost; tie(start, cost) = it; t.rangeAdd(start, i, cost); } } return t.t[1]; } int main() { int n, m; scanf("%d %d", &n, &m); int N = n + m - 1; for (int i = 1; i <= N; ++i) scanf("%d", &a[i]); int cost; for (int i = 1; i <= N; ++i) { scanf("%d", &cost); int y = min(i - 1, m - 1); int x = i - 1 - y; int index = x - y + m; int len = min(y + 1, n - x); intervals[i] = {index, len, cost}; } long long ans = 0; for (int par = 0; par <= 1; ++par) { int p = get<0>(intervals[2 - par]) % 2; int M = (N + p) / 2; for (int i = 2 - p; i <= N; i += 2) v[(i + p) / 2] = a[i]; for (int i = 1; i <= M; ++i) rEnd[i].clear(); for (int i = 2 - par; i <= N; i += 2) { int index, len, cost; tie(index, len, cost) = intervals[i]; index = (index + 1) / 2; rEnd[index + len - 1].emplace_back(index, cost); } ans += solve(M); } printf("%lld\n", ans); }

Compilation message (stderr)

colouring.cpp: In function 'int main()':
colouring.cpp:106:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
colouring.cpp:109:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |         scanf("%d", &a[i]);
      |         ~~~~~^~~~~~~~~~~~~
colouring.cpp:113:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |         scanf("%d", &cost);
      |         ~~~~~^~~~~~~~~~~~~
#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...