QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#647925 | #7950. Lucky Draws | KowerKoint# | WA | 2ms | 3640kb | C++20 | 3.2kb | 2024-10-17 16:14:51 | 2024-10-17 16:14:51 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class S, S (*op)(S, S), S (*e)()>
struct Segtree {
int _n, size, log;
vector<S> d;
void update(int k) {
d[k] = op(d[2 * k], d[2 * k + 1]);
}
int ceil_pow2(int n) {
int x = 0;
while ((1U << x) < (unsigned int)(n)) x++;
return x;
}
Segtree(int n) : Segtree(vector<S>(n, e())) {
}
Segtree(const vector<S>& v) : _n(int(v.size())) {
log = ceil_pow2(_n);
size = 1 << log;
d = vector<S>(2 * size, e());
for (int i = 0; i < _n; i++) d[size + i] = v[i];
for (int i = size - 1; i >= 1; i--) {
update(i);
}
}
void set(int p, S x) {
p += size;
d[p] = x;
for (int i = 1; i <= log; i++) update(p >> i);
}
S get(int p) {
return d[p+size];
}
S prod(int l, int r) {
S sml = e(), smr = e();
l += size;
r += size;
while (l < r) {
if (l & 1) sml = op(sml, d[l++]);
if (r & 1) smr = op(d[--r], smr);
l >>= 1;
r >>= 1;
}
return op(sml, smr);
}
};
struct S {
int dif;
int min;
};
S op(S l, S r) {
S s;
s.dif = l.dif + r.dif;
s.min = min(l.min, l.dif+r.min);
return s;
}
constexpr int INF = 40000;
S e() { return {0, INF}; }
int main() {
int n, k; cin >> n >> k;
vector<int> x;
x.reserve(n*2);
vector<int> a(n), b(n);
for(int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
a[i] = a[i]*2, b[i] = b[i]*2+1;
x.push_back(a[i]);
x.push_back(b[i]);
}
x.push_back(-2000000);
sort(x.begin(), x.end());
x.erase(unique(x.begin(), x.end()), x.end());
int m = ssize(x);
vector<vector<int>> rl(m);
for(int i = 0; i < n; i++) {
int l = lower_bound(x.begin(), x.end(), a[i]) - x.begin();
int r = lower_bound(x.begin(), x.end(), b[i]) - x.begin();
rl[r].push_back(l);
}
using Seg = Segtree<S, op, e>;
vector iv(m, S(0, 0));
iv[0].dif = INF;
iv[m-1].dif = -INF;
vector dp(k+1, Seg(iv));
auto add = [&](Seg& seg, int l, int r, int x) {
assert(l-1 >= 0);
S s0 = seg.get(l-1);
s0.dif += x;
S s1 = seg.get(r-1);
s1.dif -= x;
seg.set(l-1, s0);
seg.set(r-1, s1);
};
auto get = [&](Seg& seg, int i) {
return seg.prod(0, i).dif;
};
for(int i = 1; i < m; i++) {
for(int j = k-1; j >= 0; j--) {
int x = dp[j].prod(0, i).min;
int y = get(dp[j+1], i);
if(y > x) {
add(dp[j+1], i, i+1, x-y);
}
}
for(int j = 0; j <= k; j++) {
for(int l : rl[i]) {
add(dp[j], l, i, 1);
}
}
cerr << x[i] << endl;
for(int j = 0; j <= k; j++) {
for(int kk = 0; kk < m; kk++) {
S s = dp[j].get(kk);
cerr << "{" << s.dif << "," << s.min << "}";
}
cerr << endl;
}
cerr << "=============" << endl;
}
cin.tie(0);
ios_base::sync_with_stdio(0);
cout << n - dp[k].prod(0, m).min << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 3512kb
input:
5 2 1 2 1 4 3 6 4 7 5 6
output:
5
result:
ok single line: '5'
Test #2:
score: 0
Accepted
time: 1ms
memory: 3640kb
input:
3 2 2 4 1 3 3 5
output:
3
result:
ok single line: '3'
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 3632kb
input:
4 1 2 3 1 1 4 5 4 5
output:
4
result:
wrong answer 1st lines differ - expected: '2', found: '4'