Submission #282576

#TimeUsernameProblemLanguageResultExecution timeMemory
282576SamAndTeams (IOI15_teams)C++17
77 / 100
4029 ms156556 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; #define m_p make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second typedef long long ll; const int N = 500005, L = 20; struct ban { int l, r; }; bool operator<(const ban& a, const ban& b) { return a.l < b.l; } int n; ban a[N]; vector<int> v[N]; int root[N]; int z; int t[N * L]; int ul[N * L], ur[N * L]; int ubd(int tl, int tr, int x, int pos) { int ypos = ++z; ul[ypos] = ul[pos]; ur[ypos] = ur[pos]; t[ypos] = t[pos]; t[ypos]++; if (tl == tr) return ypos; int m = (tl + tr) / 2; if (x <= m) { ul[ypos] = ubd(tl, m, x, ul[pos]); } else { ur[ypos] = ubd(m + 1, tr, x, ur[pos]); } return ypos; } int qry(int tl, int tr, int l, int r, int pos) { if (l > r) return 0; if (tl == l && tr == r) return t[pos]; int m = (tl + tr) / 2; return (qry(tl, m, l, min(m, r), ul[pos]) + qry(m + 1, tr, max(m + 1, l), r, ur[pos])); } int qryy(int l1, int r1, int l2, int r2) { return qry(1, n, l2, r2, root[r1]) - qry(1, n, l2, r2, root[l1 - 1]); } void init(int N_, int A[], int B[]) { n = N_; for (int i = 0; i < n; ++i) { a[i].l = A[i]; a[i].r = B[i]; v[a[i].l].push_back(a[i].r); } sort(a, a + n); for (int i = 1; i <= n; ++i) { root[i] = root[i - 1]; for (int j = 0; j < sz(v[i]); ++j) root[i] = ubd(1, n, v[i][j], root[i]); } } int m; int b[N]; int can(int M_, int K[]) { m = M_; for (int i = 0; i < m; ++i) b[i] = K[i]; sort(b, b + m); ll sum = 0; for (int i = 0; i < m; ++i) sum += b[i]; if (sum > n) return 0; /*multiset<int> s; int j = 0; for (int i = 0; i < m; ++i) { while (j < n && a[j].l <= b[i]) s.insert(a[j++].r); while (!s.empty() && *s.begin() < b[i]) s.erase(s.begin()); if (sz(s) < b[i]) return 0; for (int j = 0; j < b[i]; ++j) s.erase(s.begin()); }*/ vector<pair<int, int> > v; v.push_back(m_p(b[0], b[0])); for (int i = 1; i < m; ++i) { if (b[i] == v.back().fi) v.back().se += b[i]; else v.push_back(m_p(b[i], b[i])); } vector<int> h; h.assign(sz(v), 0); for (int i = 0; i < sz(v); ++i) { for (int j = i; j < sz(v); ++j) { int nx; if (j == sz(v) - 1) nx = n + 1; else nx = v[j + 1].fi; int q = qryy(1, v[i].fi, v[j].fi, nx - 1) - h[j]; if (q < v[i].se) { h[j] += q; v[i].se -= q; } else { h[j] += v[i].se; v[i].se = 0; break; } } if (v[i].se) return 0; } return 1; }

Compilation message (stderr)

teams.cpp: In function 'int can(int, int*)':
teams.cpp:117:29: warning: declaration of 'v' shadows a global declaration [-Wshadow]
  117 |     vector<pair<int, int> > v;
      |                             ^
teams.cpp:24:13: note: shadowed declaration is here
   24 | vector<int> v[N];
      |             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...