#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
const int INF = numeric_limits<int>::max()/4;
typedef long long ll;
vector<int> va, vb;
int n;
struct st {
vector<int> v, lazy;
int as;
};
void push (st &seg, int i) {
int d = seg.lazy[i];
seg.lazy[i*2] += d;
seg.v[i*2] += d;
seg.lazy[i*2 + 1] += d;
seg.v[i*2 + 1] += d;
seg.lazy[i] = 0;
}
st build (int n) {
int as = 1 << (__lg(n) + 1);
vector<int> v (as*2, INF);
vector<int> lazy (as*2, 0);
return {v, lazy, as};
}
int query (st &seg, int l, int r, int i = 1, int lo = 0, int hi = -1) {
if (hi == -1) hi = seg.as;
if (lo >= r || hi <= l) return INF;
if (l <= lo && hi <= r) return seg.v[i];
push(seg, i);
int mid = (lo + hi) / 2;
int q1 = query(seg, l, r, i*2, lo, mid);
int q2 = query(seg, l, r, i*2 + 1, mid, hi);
return min(q1, q2);
}
void update (st &seg, int id, int x, int i = 1, int lo = 0, int hi = -1) {
if (hi == -1) hi = seg.as;
if (lo == hi-1) {
seg.v[i] = x;
return;
}
push(seg, i);
int mid = (lo + hi) / 2;
if (id < mid) {
update(seg, id, x, i*2, lo, mid);
} else {
update(seg, id, x, i*2 + 1, mid, hi);
}
seg.v[i] = min(seg.v[i*2], seg.v[i*2 + 1]);
}
void apply (st &seg, int l, int r, int d, int i = 1, int lo = 0, int hi = -1) {
if (hi == -1) hi = seg.as;
if (lo >= r || hi <= l) return;
if (l <= lo && hi <= r) {
seg.lazy[i] += d;
seg.v[i] += d;
return;
}
push(seg, i);
int mid = (lo + hi) / 2;
apply(seg, l, r, d, i*2, lo, mid);
apply(seg, l, r, d, i*2 + 1, mid, hi);
seg.v[i] = min(seg.v[i*2], seg.v[i*2 + 1]);
}
void init(int N, int A[], int B[]) {
vector<pair<int, int>> vq {};
for (int i = 0; i < N; i++) {
vq.push_back({A[i], B[i]});
}
sort(vq.begin(), vq.end());
for (int i = 0; i < N; i++) {
va.push_back(vq[i].first);
vb.push_back(vq[i].second);
}
n = N;
}
int can(int M, int K[]) {
map<int, int> ts {};
ll total = 0;
for (int i = 0; i < M; i++) {
ts[K[i]] += 1;
total += K[i];
}
if (total > n) return 0;
int m = ts.size();
vector<int> vk {};
vector<int> vc {};
for (auto [k, s] : ts) {
vk.push_back(k);
vc.push_back(k*s);
}
bool possible = true;
st seg = build (m+1);
update(seg, 0, n);
int id = 0; // student
set<pair<int, int>> s {}; // b, student id
for (int i = 0; i < m; i++) {
while (id < n && va[id] <= vk[i]) {
s.insert({vb[id], id});
id++;
}
while (!s.empty() && s.begin()->first < vk[i]) {
auto[b, rid] = *s.begin();
int a = va[rid];
auto it = lower_bound(vk.begin(), vk.end(), a);
apply(seg, 0, distance(vk.begin(), it) + 1, -1);
s.erase(s.begin());
}
int sol = query(seg, 0, i+1) - vc[i];
update(seg, i+1, sol);
if (sol - n + id < 0) return 0;
}
return 1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |