QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#519632 | #7605. Yet Another Mex Problem | liuziao | WA | 5ms | 8060kb | C++23 | 4.2kb | 2024-08-14 22:23:58 | 2024-08-14 22:23:58 |
Judging History
answer
#include <bits/stdc++.h>
#define int int64_t
using pii = std::pair<int, int>;
const int kMaxN = 2e5 + 5;
int n, k;
int a[kMaxN], sum[kMaxN], f[kMaxN];
pii sub(pii a, pii b) { return {a.first - b.first, a.second - b.second}; }
int mul(pii a, pii b) { return a.first * b.second - a.second * b.first; }
int func(pii a, int k) { return a.first * k + a.second; }
struct SGT1 {
int mi[kMaxN * 4];
void pushup(int x) { mi[x] = std::min(mi[x << 1], mi[x << 1 | 1]); }
void update(int x, int l, int r, int ql, int v) {
if (l == r) return void(mi[x] = v);
int mid = (l + r) >> 1;
if (ql <= mid)
update(x << 1, l, mid, ql, v);
else
update(x << 1 | 1, mid + 1, r, ql, v);
pushup(x);
}
int getmex(int x, int l, int r, int ql) {
assert(mi[x] < ql);
if (l == r) return l;
int mid = (l + r) >> 1;
if (mi[x << 1] < ql)
return getmex(x << 1, l, mid, ql);
else
return getmex(x << 1 | 1, mid + 1, r, ql);
}
int query(int x, int l, int r, int ql, int qr) {
if (l > qr || r < ql)
return 1e9;
else if (l >= ql && r <= qr)
return mi[x];
int mid = (l + r) >> 1;
return std::min(query(x << 1, l, mid, ql, qr),
query(x << 1 | 1, mid + 1, r, ql, qr));
}
} sgt1;
struct SGT2 { // f[l] - mex * sum[l]
// (sum[l], f[l]) 上凸壳
std::vector<pii> v[kMaxN * 4];
void ins(int x, pii p) {
if (!v[x].empty() && p <= v[x].back()) return;
assert(v[x].empty() || p.first >= v[x].back().first);
for (;
v[x].size() >= 2 &&
mul(sub(p, v[x].back()), sub(v[x].back(), v[x][v[x].size() - 2])) <= 0;
v[x].pop_back()) {
}
v[x].emplace_back(p);
}
int getmax(int x, int k) {
if (!v[x].size()) return -1e18;
int L = 0, R = v[x].size(), res = 0;
while (L + 1 < R) {
int mid = (L + R) >> 1;
if (func(v[x][mid], k) >= func(v[x][mid - 1], k))
L = res = mid;
else
R = mid;
}
return func(v[x][res], k);
// int ret = -1e18;
// for (auto p : v[x]) ret = std::max(ret, func(p, k));
// return ret;
}
void update(int x, int l, int r, int ql, pii p) {
ins(x, p);
if (l == r) return;
int mid = (l + r) >> 1;
if (ql <= mid)
update(x << 1, l, mid, ql, p);
else
update(x << 1 | 1, mid + 1, r, ql, p);
}
int query(int x, int l, int r, int ql, int qr, int k) {
if (l > qr || r < ql)
return -1e18;
else if (l >= ql && r <= qr)
return getmax(x, k);
int mid = (l + r) >> 1;
return std::max(query(x << 1, l, mid, ql, qr, k),
query(x << 1 | 1, mid + 1, r, ql, qr, k));
}
} sgt2, sgt3;
void dickdreamer() {
std::cin >> n >> k;
for (int i = 1; i <= n; ++i) {
std::cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
sgt2.update(1, 0, n, 0, {0, 0}), sgt3.update(1, 0, n, 0, {0, 0});
for (int i = 1; i <= n; ++i) {
int l = sgt1.query(1, 0, n, 0, a[i]) + 1,
r = (a[i] ? sgt1.query(1, 0, n, 0, a[i] - 1) : i);
sgt1.update(1, 0, n, a[i], i);
// std::cerr << i << " : ---------\n";
for (; l <= r;) {
int mex = sgt1.getmex(1, 0, n, r), t = sgt1.query(1, 0, n, 0, mex);
int val = sgt2.query(1, 0, n, t, r - 1, -mex);
// std::cerr << "!!! " << mex << ' ' << t << ' ' << val << '\n';
sgt3.update(1, 0, n, t, {mex, val});
r = t;
}
l = std::max<int>(i - k + 1, 1);
int mex = sgt1.getmex(1, 0, n, l);
r = (mex ? sgt1.query(1, 0, n, 0, mex - 1) : i);
assert(l <= r);
f[i] = std::max(sgt3.query(1, 0, n, l - 1, i - 1, sum[i]),
sgt2.query(1, 0, n, l - 1, r - 1, -mex) + sum[i] * mex);
sgt2.update(1, 0, n, i, {sum[i], f[i]}), sgt3.update(1, 0, n, i, {0, f[i]});
// std::cerr << i << ' ' << f[i] << '\n';
}
std::cout << f[n] << '\n';
}
int32_t main() {
#ifdef ORZXKR
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
int T = 1;
// std::cin >> T;
while (T--) dickdreamer();
// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 5672kb
input:
5 3 3 4 0 0 3
output:
10
result:
ok 1 number(s): "10"
Test #2:
score: 0
Accepted
time: 0ms
memory: 7720kb
input:
8 4 0 1 2 0 3 1 4 1
output:
26
result:
ok 1 number(s): "26"
Test #3:
score: 0
Accepted
time: 2ms
memory: 7780kb
input:
10 5 0 2 0 1 2 1 0 2 2 1
output:
33
result:
ok 1 number(s): "33"
Test #4:
score: 0
Accepted
time: 2ms
memory: 7848kb
input:
20 10 3 1 3 2 3 3 0 1 3 0 2 3 3 3 3 1 3 0 0 3
output:
160
result:
ok 1 number(s): "160"
Test #5:
score: 0
Accepted
time: 2ms
memory: 5676kb
input:
30 10 14 15 10 1 14 1 8 0 12 8 6 15 1 8 9 12 15 10 11 12 7 10 10 3 3 10 8 14 13 13
output:
172
result:
ok 1 number(s): "172"
Test #6:
score: 0
Accepted
time: 2ms
memory: 5812kb
input:
40 3 0 4 2 4 3 1 5 5 2 3 4 2 1 1 1 5 5 4 1 3 3 0 1 0 2 0 1 4 2 1 5 3 0 4 0 0 0 5 3 3
output:
51
result:
ok 1 number(s): "51"
Test #7:
score: 0
Accepted
time: 2ms
memory: 7724kb
input:
50 20 29 6 30 26 8 11 22 26 24 8 30 25 19 12 28 19 28 4 13 9 2 23 30 15 21 5 30 5 19 17 25 29 2 28 20 16 0 4 26 23 22 30 3 25 29 5 29 24 11 27
output:
378
result:
ok 1 number(s): "378"
Test #8:
score: 0
Accepted
time: 2ms
memory: 5760kb
input:
80 15 2 13 20 11 12 10 19 17 3 7 10 2 14 11 9 17 19 11 17 15 10 18 11 11 14 5 20 8 8 12 13 17 14 19 11 20 13 2 12 2 19 12 6 7 3 4 11 16 1 12 4 16 17 4 1 2 5 11 17 12 13 7 8 12 2 4 15 20 18 1 1 13 1 14 6 5 20 12 12 11
output:
0
result:
ok 1 number(s): "0"
Test #9:
score: 0
Accepted
time: 2ms
memory: 5780kb
input:
100 30 41 50 33 22 1 34 7 14 31 44 46 49 49 23 33 12 9 41 25 23 22 1 49 45 45 8 10 49 37 23 48 17 32 44 38 21 29 27 23 27 47 44 6 12 7 2 18 12 9 43 20 26 26 8 14 25 18 48 2 41 49 7 48 38 10 45 34 27 17 12 1 19 9 29 50 13 25 21 9 13 26 15 6 9 5 13 47 30 26 17 40 0 21 6 25 24 22 31 43 16
output:
1308
result:
ok 1 number(s): "1308"
Test #10:
score: 0
Accepted
time: 2ms
memory: 7824kb
input:
200 30 1 26 8 2 6 36 43 49 15 48 39 7 12 18 28 46 13 6 24 17 43 44 31 17 30 5 40 19 13 24 26 1 23 39 34 29 28 2 22 23 32 21 32 5 38 11 18 10 15 14 16 7 40 40 35 30 8 3 46 25 36 50 13 37 16 42 39 9 24 5 8 2 15 17 24 35 39 26 5 24 39 23 47 17 23 49 21 30 36 46 26 15 0 24 23 25 12 16 12 18 42 30 20 0 5...
output:
3389
result:
ok 1 number(s): "3389"
Test #11:
score: 0
Accepted
time: 2ms
memory: 7820kb
input:
300 30 39 28 33 6 10 36 27 31 1 1 9 41 27 39 48 30 43 49 0 11 39 36 15 40 43 28 18 15 17 23 4 9 37 32 5 34 3 4 45 44 18 24 6 23 18 21 40 7 18 38 35 14 5 44 4 10 25 34 14 8 23 43 28 11 22 13 44 16 30 49 40 13 21 32 50 30 29 31 27 35 1 30 10 49 42 33 46 30 47 48 13 5 5 41 22 3 26 26 33 20 34 41 46 27 ...
output:
6636
result:
ok 1 number(s): "6636"
Test #12:
score: 0
Accepted
time: 2ms
memory: 5916kb
input:
400 30 25 30 7 36 38 37 10 15 37 6 4 49 42 34 43 13 46 40 1 6 35 29 50 13 30 23 48 12 43 23 32 44 28 28 1 41 2 31 44 40 5 1 6 17 50 5 40 5 48 36 32 47 20 24 25 42 17 40 8 43 9 10 43 34 30 36 48 48 37 18 21 23 26 20 24 2 44 10 22 46 38 12 50 4 9 17 19 30 6 25 1 20 33 33 21 6 15 11 27 22 2 25 22 30 8 ...
output:
5312
result:
ok 1 number(s): "5312"
Test #13:
score: 0
Accepted
time: 2ms
memory: 5800kb
input:
500 30 11 7 6 40 43 14 47 49 22 9 25 32 6 4 12 48 25 31 2 26 30 46 10 36 43 46 2 34 45 48 11 28 43 22 47 47 1 32 41 36 41 3 31 8 31 14 12 2 2 8 0 30 34 5 46 46 6 20 25 27 46 3 34 8 36 33 27 4 19 10 3 32 33 9 49 24 9 15 18 6 0 20 13 11 28 1 18 30 18 4 12 34 39 50 20 35 30 47 46 24 46 36 49 34 21 10 7...
output:
9118
result:
ok 1 number(s): "9118"
Test #14:
score: 0
Accepted
time: 0ms
memory: 7952kb
input:
600 30 49 8 31 19 46 14 31 32 33 39 20 15 46 25 6 32 2 48 28 20 26 39 44 9 5 43 31 30 23 47 39 10 33 42 44 3 26 7 15 6 28 31 5 2 11 24 11 1 6 6 21 10 25 36 16 26 23 27 19 10 33 47 49 7 43 5 32 37 24 3 9 17 39 49 24 20 50 20 15 18 12 27 3 43 46 36 43 31 28 32 50 50 44 43 19 13 20 6 15 26 14 45 25 11 ...
output:
9497
result:
ok 1 number(s): "9497"
Test #15:
score: 0
Accepted
time: 2ms
memory: 5892kb
input:
700 200 190 11 82 65 81 32 130 4 124 52 155 181 166 29 44 49 187 134 155 130 127 17 76 156 59 155 171 194 110 2 102 122 48 191 31 25 83 154 184 56 38 175 50 190 162 191 116 198 170 173 160 177 184 194 195 64 120 27 154 192 96 160 183 196 76 109 15 81 9 189 120 55 42 17 192 20 100 53 29 197 181 152 1...
output:
142372
result:
ok 1 number(s): "142372"
Test #16:
score: 0
Accepted
time: 3ms
memory: 5984kb
input:
800 200 197 112 65 12 115 42 97 158 105 122 140 175 154 63 192 103 43 87 11 114 164 35 179 101 171 13 104 179 185 78 96 75 93 19 191 108 136 161 152 183 123 199 99 197 147 185 82 112 6 157 178 180 200 47 95 15 153 71 89 172 182 98 187 19 129 126 59 166 2 75 135 86 64 37 58 64 148 195 45 165 125 115 ...
output:
193511
result:
ok 1 number(s): "193511"
Test #17:
score: 0
Accepted
time: 0ms
memory: 5996kb
input:
900 200 27 187 75 160 123 52 39 137 85 65 149 67 65 122 140 57 101 39 143 200 100 153 57 47 7 172 62 140 34 153 91 4 61 148 51 165 64 92 119 10 183 97 48 2 58 53 48 1 43 117 71 84 115 176 96 192 109 14 124 51 168 137 191 168 182 143 4 50 71 162 75 16 86 158 50 84 120 60 137 158 69 53 32 24 59 94 178...
output:
387825
result:
ok 1 number(s): "387825"
Test #18:
score: 0
Accepted
time: 0ms
memory: 8060kb
input:
1000 500 120 156 148 83 1 52 17 33 164 176 165 3 66 161 99 132 190 83 124 139 172 30 67 87 132 61 36 8 116 128 162 151 166 24 84 160 52 180 80 120 36 82 97 159 0 83 60 45 195 47 186 166 91 191 88 146 167 133 147 38 126 182 82 23 0 31 70 8 77 118 85 50 55 144 56 115 34 58 57 13 89 132 37 6 11 105 187...
output:
1033863
result:
ok 1 number(s): "1033863"
Test #19:
score: 0
Accepted
time: 4ms
memory: 6300kb
input:
2000 200 39 181 151 81 34 229 56 147 86 128 55 47 211 141 215 97 28 16 235 144 172 198 92 48 226 86 113 233 119 81 123 222 129 200 61 21 246 55 6 66 65 2 5 10 109 239 236 164 185 98 3 236 123 21 131 125 46 235 67 83 205 214 243 111 173 99 2 240 159 66 80 211 96 185 167 187 218 38 105 194 199 57 33 1...
output:
399183
result:
ok 1 number(s): "399183"
Test #20:
score: -100
Wrong Answer
time: 5ms
memory: 6668kb
input:
3000 600 92 85 85 10 57 53 30 1 89 14 70 26 72 73 14 70 30 58 50 78 4 75 79 48 73 40 88 92 5 83 21 57 6 16 30 80 9 76 42 81 17 94 24 72 76 67 85 85 17 68 21 1 14 68 41 86 74 53 73 60 30 70 63 47 100 92 45 67 22 14 69 31 26 56 53 30 43 69 62 52 39 10 47 17 72 93 5 65 32 41 69 88 41 2 14 46 81 49 65 1...
output:
14734367
result:
wrong answer 1st numbers differ - expected: '14762368', found: '14734367'