Submission #1292440

#TimeUsernameProblemLanguageResultExecution timeMemory
12924401otaTopical (NOI23_topical)C++20
40 / 100
1078 ms211800 KiB
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long #define pii pair<int, int> #define ff first #define ss second #define entire(x) (x).begin(), (x).end() const int inf = 9e18; struct SegTree{ int n; pii identity = {-inf, -inf}; vector<pii> Tree; function<pii(pii&, pii&)> combine = [](pii& a, pii& b) { return max(a, b); }; SegTree (int n) : n(n) { Tree.resize(4 * n, identity); } void build (vector<pii>& arr, int idx, int l, int r){ if (l == r) { Tree[idx] = arr[l]; return; } int mid = (l + r) / 2; build(arr, 2 * idx + 1, l, mid); build(arr, 2 * idx + 2, mid+1, r); Tree[idx] = combine(Tree[2 * idx + 1], Tree[2 * idx + 2]); } void build(vector<pii>& arr){ build(arr, 0, 0, n-1); } void update (int i, int delta, int idx, int l, int r){ if (l == r and i == l) {Tree[idx].ff += delta; return; } if (i < l or r < i) return; int mid = (l + r) / 2; update(i, delta, 2 * idx + 1, l, mid); update(i, delta, 2 * idx + 2, mid+1, r); Tree[idx] = combine(Tree[2 * idx + 1], Tree[2 * idx + 2]); } void update (int i, int delta){ update(i, delta, 0, 0, n-1); } pii query (int ql, int qr, int idx, int l, int r){ if (r < ql or qr < l) return identity; if (ql <= l and r <= qr) return Tree[idx]; int mid = (l + r) / 2; pii v1 = query(ql, qr, 2 * idx + 1, l, mid); pii v2 = query(ql, qr, 2 * idx + 2, mid+1, r); return combine(v1, v2); } pii query (){ return query(0, n-1, 0, 0, n-1); } }; int32_t main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; vector<vector<int>> a(n, vector<int>(k, 0)), b(n, vector<int>(k, 0)); for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) cin >> a[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) cin >> b[i][j]; vector<vector<pii>> t(k, vector<pii>(n)); for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) t[j][i] = pii{a[i][j], i}; for (int i = 0; i < k; i++) sort(entire(t[i])); int ans = 0; vector<int> c(n, 0), idx(k, 0), cur(k, 0); SegTree lesson(n); vector<pii> initialState(n); for (int i = 0; i < n; i++){ auto& [ci, ind] = initialState[i]; ci = 0; ind = i; } lesson.build(initialState); auto update = [&](){ for (int i = 0; i < k; i++){ while (idx[i] < n and t[i][idx[i]].ff <= cur[i]) lesson.update(t[i][idx[i]].ss, 1), idx[i]++; } }; auto add = [&](){ auto [ci, i] = lesson.query(); if (ci == k){ lesson.update(i, -inf); for (int j = 0; j < k; j++) cur[j] += b[i][j]; return true; } return false; }; for (int i = 0; i < n; i++){ update(); if (!add()) break; ans++; } cout << ans << endl; 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...