Submission #687686

#TimeUsernameProblemLanguageResultExecution timeMemory
687686tvladm2009Teams (IOI15_teams)C++17
0 / 100
1154 ms391284 KiB
#include <bits/stdc++.h> struct Interval { int l; int r; int pos; }; using namespace std; typedef long long ll; const int N = (int) 5e5 + 7; const int Q = (int) 2e5 + 7; pair<int, int> a[N]; vector<int> pos[N]; int n, q; struct Node { Node *left; Node *right; int sum; Node() { left = NULL; right = NULL; sum = 0; } }; Node *segt[N]; void build(Node *root, int tl, int tr) { if (tl == tr) { root->sum = 0; } else { root->left = new Node(); root->right = new Node(); int tm = (tl + tr) / 2; build(root->left, tl, tm); build(root->right, tm + 1, tr); root->sum = root->left->sum + root->right->sum; } } void update(Node *root, Node *prev, int tl, int tr, int pos, int val) { if (tl == tr) { root->sum += val; } else { int tm = (tl + tr) / 2; if (pos <= tm) { root->left = new Node(); root->right = prev->right; update(root->left, prev->left, tl, tm, pos, val); } else { root->left = prev->left; root->right = new Node(); update(root->right, prev->right, tm + 1, tr, pos, val); } root->sum = root->left->sum + root->right->sum; } } int query(Node *root, int tl, int tr, int l, int r) { if (l <= tl && tr <= r) { return root->sum; } int tm = (tl + tr) / 2; if (l <= tm && r <= tm) { return query(root->left, tl, tm, l, r); } else if (tm + 1 <= l && tm + 1 <= r) { return query(root->right, tm + 1, tr, l, r); } else { return query(root->left, tl, tm, l, tm) + query(root->right, tm + 1, tr, tm + 1, r); } } int getkth(int l, int r, int k) { int low = 0, high = n, ret = 0; while (low <= high) { int mid = (low + high) / 2; if (query(segt[mid], 1, n, l, r) < k) { ret = mid; low = mid + 1; } else { high = mid - 1; } } return ret + 1; } void init(int N, int A[], int B[]) { n = N; for (int i = 1; i <= n; i++) { a[i].first = A[i - 1]; a[i].second = B[i - 1]; } sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) { pos[a[i].second].push_back(i); } segt[0] = new Node(); build(segt[0], 1, n); for (int i = 1; i <= n; i++) { segt[i] = new Node(); if ((int) pos[i].size() == 0) segt[i] = segt[i - 1]; for (auto &it : pos[i]) { update(segt[i], segt[i - 1], 1, n, it, 1); } } } int can(int M, int K[]) { q = M; vector<int> queries(q + 1); for (int i = 1; i <= q; i++) { queries[i] = K[i - 1]; } sort(queries.begin(), queries.end()); int j = 1; vector<Interval> st; for (int i = 1; i <= q; i++) { int low = 0, high = n, ret = 0; while (low <= high) { int mid = (low + high) / 2; if (a[mid].first <= queries[i]) { ret = mid; low = mid + 1; } else { high = mid - 1; } } ret++; if (j < ret) st.push_back({j, ret - 1, 0}); j = ret; int aux = queries[i]; while (aux > 0) { if ((int) st.size() == 1) { st[0].pos = max(st[0].pos, query(segt[queries[i] - 1], 1, n, st[0].l, st[0].r)); if (st[0].pos + aux <= (st[0].r - st[0].l + 1)) { st[0].pos += aux; aux = 0; break; } else { return false; } } else { st[(int) st.size() - 1].pos = max(st[(int) st.size() - 1].pos, query(segt[queries[i] - 1], 1, n, st[(int) st.size() - 1].l, st[(int) st.size() - 1].r)); st[(int) st.size() - 2].pos = max(st[(int) st.size() - 2].pos, query(segt[queries[i] - 1], 1, n, st[(int) st.size() - 2].l, st[(int) st.size() - 2].r)); int kth = getkth(st[(int) st.size() - 2].l, st[(int) st.size() - 2].r, st[(int) st.size() - 2].pos); int newadded = max(0, query(segt[kth - 1], 1, n, st[(int) st.size() - 1].l, st[(int) st.size() - 1].r) - st[(int) st.size() - 1].pos); if (newadded <= aux) { st[(int) st.size() - 2].pos += st[(int) st.size() - 1].pos + newadded; st[(int) st.size() - 2].r = st[(int) st.size() - 1].r; st.pop_back(); aux -= newadded; } else { st[(int) st.size() - 1].pos += aux; aux = 0; } } } } return true; }

Compilation message (stderr)

teams.cpp: In function 'void update(Node*, Node*, int, int, int, int)':
teams.cpp:45:57: warning: declaration of 'pos' shadows a global declaration [-Wshadow]
   45 | void update(Node *root, Node *prev, int tl, int tr, int pos, int val) {
      |                                                     ~~~~^~~
teams.cpp:15:13: note: shadowed declaration is here
   15 | vector<int> pos[N];
      |             ^~~
teams.cpp: In function 'void init(int, int*, int*)':
teams.cpp:91:15: warning: declaration of 'N' shadows a global declaration [-Wshadow]
   91 | void init(int N, int A[], int B[]) {
      |           ~~~~^
teams.cpp:12:11: note: shadowed declaration is here
   12 | const int N = (int) 5e5 + 7;
      |           ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...