QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#133183 | #6630. Triangle Collection | Cyanmond | 5 | 958ms | 17892kb | C++14 | 7.0kb | 2023-08-01 17:03:10 | 2023-08-01 17:03:20 |
Judging History
answer
#include <bits/stdc++.h>
// #include "atcoder/modint"
using i64 = long long;
// using Fp = atcoder::modint998244353;
int op(int a, int b) {
return std::min(a, b);
}
int e() {
return 0;
}
int mapping(int a, int b) {
return a + b;
}
int composition(int a, int b) {
return a + b;
}
int id() {
return 0;
}
class LazySegTree {
int n, size, log;
std::vector<int> data, lazy;
void upd(int i) {
data[i] = op(data[2 * i], data[2 * i + 1]);
}
void app(int k, int f) {
data[k] = mapping(f, data[k]);
if (k < size) lazy[k] = composition(f, lazy[k]);
}
void push(int k) {
app(2 * k, lazy[k]);
app(2 * k + 1, lazy[k]);
lazy[k] = id();
}
public:
LazySegTree(int n_) : n(n_) {
log = 1;
while ((1 << log) < n) ++log;
size = 1 << log;
data.assign(2 * size, e());
lazy.assign(size, id());
}
int fold(int l, int r) {
if (l == r) return e();
l += size;
r += size;
for (int d = log; d >= 1; --d) {
if (((l >> d) << d) != l) push(l >> d);
if (((r >> d) << d) != r) push((r - 1) >> d);
}
int ret = 1 << 30;
while (l < r) {
if (l % 2 == 1) ret = op(ret, data[l++]);
if (r % 2 == 1) ret = op(ret, data[--r]);
l /= 2;
r /= 2;
}
return ret;
}
int allfold() {
return data[1];
}
void apply(int l, int r, int f) {
l += size;
r += size;
for (int d = log; d >= 1; --d) {
if (((l >> d) << d) != l) push(l >> d);
if (((r >> d) << d) != r) push((r - 1) >> d);
}
int l2 = l, r2 = r;
while (l < r) {
if (l % 2 == 1) app(l++, f);
if (r % 2 == 1) app(--r, f);
l /= 2;
r /= 2;
}
l = l2;
r = r2;
for (int d = 1; d <= log; ++d) {
if (((l >> d) << d) != l) upd(l >> d);
if (((r >> d) << d) != r) upd((r - 1) >> d);
}
}
int get(int i) {
return fold(i, i + 1);
}
void set(int i, int v) {
apply(i, i + 1, v - get(i));
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, Q;
std::cin >> N >> Q;
std::vector<i64> C(N + 1);
for (int i = 1; i <= N; ++i) {
std::cin >> C[i];
}
std::vector<i64> L(Q), D(Q);
for (int i = 0; i < Q; ++i) {
std::cin >> L[i] >> D[i];
}
/*
if (N <= 2000 and Q <= 2000) {
for (int q = 0; q < Q; ++q) {
C[L[q]] += D[q];
std::vector<int> O;
for (int i = 1; i <= N; ++i) {
if (C[i] % 2 == 1) {
O.push_back(i);
}
}
auto D = C;
for (auto &e : D) e = e / 2;
int i = N;
std::reverse(O.begin(), O.end());
i64 ans = 0;
for (const auto s : O) {
while (i != 0 and D[i] == 0) --i;
const int l = s / 2 + 1;
if (i >= l) {
--D[i];
++ans;
}
}
i64 sum = 0;
for (auto e : D) sum += e;
ans += sum * 2 / 3;
std::cout << ans << std::endl;
}
return 0;
}
*/
// subtask 3
std::set<int> a, b, x, y;
for (int i = 1; i <= N; ++i) {
if (C[i] == 1) a.insert(i);
if (C[i] == 2) x.insert(i);
}
int p = 0;
LazySegTree seg(N + 1);
for (int i = 0; i <= N; ++i) seg.set(i, 0);
while (true) {
if (a.empty() or x.empty()) break;
const int u = *a.begin(), v = *x.rbegin();
seg.apply((u / 2) + 1, N + 1, 1);
seg.apply(v, N + 1, -1);
if (seg.allfold() < 0) {
seg.apply((u / 2) + 1, N + 1, -1);
seg.apply(v, N + 1, 1);
break;
} else {
++p;
a.erase(u);
x.erase(v);
b.insert(u);
y.insert(v);
}
}
/*
for (const auto e : a) std::cerr << e << ' ';
std::cerr << std::endl;
for (const auto e : b) std::cerr << e << ' ';
std::cerr << std::endl;
for (const auto e : x) std::cerr << e << ' ';
std::cerr << std::endl;
for (const auto e : y) std::cerr << e << ' ';
std::cerr << std::endl;
*/
auto upd = [&]() {
while (seg.allfold() < 0) {
const int u = *b.rbegin(), v = *y.begin();
seg.apply((u / 2) + 1, N + 1, -1);
seg.apply(v, N + 1, 1);
--p;
b.erase(u);
y.erase(v);
a.insert(u);
x.insert(v);
}
while (true) {
if (a.empty() or x.empty()) break;
const int u = *a.begin(), v = *x.rbegin();
seg.apply((u / 2) + 1, N + 1, 1);
seg.apply(v, N + 1, -1);
if (seg.allfold() < 0) {
seg.apply((u / 2) + 1, N + 1, -1);
seg.apply(v, N + 1, 1);
break;
} else {
++p;
a.erase(u);
x.erase(v);
b.insert(u);
y.insert(v);
}
}
};
auto erase = [&](int v) {
if (a.find(v) != a.end()) {
a.erase(v);
}
if (b.find(v) != b.end()) {
seg.apply((v / 2) + 1, N + 1, -1);
const int o = *y.begin();
seg.apply(o, N + 1, 1);
y.erase(o);
x.insert(o);
b.erase(v);
--p;
}
if (x.find(v) != x.end()) {
x.erase(v);
}
if (y.find(v) != y.end()) {
seg.apply(v, N + 1, 1);
const int o = *b.rbegin();
seg.apply((o / 2) + 1, N + 1, -1);
b.erase(o);
a.insert(o);
y.erase(v);
--p;
}
};
auto rollback = [&]() {
if (b.empty()) return;
const int u = *b.rbegin(), v = *y.begin();
seg.apply((u / 2) + 1, N + 1, -1);
seg.apply(v, N + 1, 1);
--p;
b.erase(u);
y.erase(v);
a.insert(u);
x.insert(v);
};
auto adda = [&](int v) {
a.insert(v);
rollback();
upd();
};
auto addx = [&](int v) {
x.insert(v);
rollback();
upd();
};
for (int q = 0; q < Q; ++q) {
erase(L[q]);
C[L[q]] += D[q];
if (C[L[q]] == 1) adda(L[q]);
else if (C[L[q]] == 2) addx(L[q]);
upd();
std::cout << p + x.size() * 2 / 3 << '\n';
}
/*
if (std::all_of(D.begin(), D.end(), [&](int v) {
return std::abs(v) <= 1;
})) {
// subtask 4
} else {
// subtask 3
}
*/
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3536kb
input:
1 23 1485 1 -12 1 -30 1 -20 1 6 1 24 1 5 1 31 1 14 1 -34 1 -22 1 -45 1 37 1 46 1 9 1 22 1 -9 1 9 1 -46 1 -47 1 39 1 36 1 -36 1 50
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
wrong answer 1st numbers differ - expected: '491', found: '0'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 5
Accepted
Test #28:
score: 5
Accepted
time: 5ms
memory: 3616kb
input:
1999 2000 1 1 1 1 0 2 0 2 1 0 2 1 2 2 2 1 2 0 0 1 2 2 0 1 0 1 0 2 0 0 2 1 1 1 1 0 1 2 1 2 1 1 1 1 1 0 2 2 0 2 1 1 2 0 0 2 0 0 2 1 2 0 0 1 1 2 0 2 2 2 1 2 0 2 1 2 0 1 2 2 2 1 1 2 1 1 1 1 0 0 1 1 0 1 2 1 0 0 2 0 2 2 2 0 1 1 2 0 0 1 0 0 2 1 2 1 2 0 1 1 2 2 0 0 1 2 2 1 2 1 2 2 2 0 0 1 1 2 1 1 2 2 2 2 2 ...
output:
660 660 660 661 661 661 661 660 660 660 660 661 662 662 663 663 662 661 662 662 661 660 661 660 660 660 661 661 661 661 662 661 661 660 661 660 659 658 658 659 659 658 659 660 660 660 660 660 660 659 659 659 659 659 659 659 659 660 659 658 658 658 658 657 657 657 658 657 656 657 657 657 656 656 655 ...
result:
ok 2000 numbers
Test #29:
score: 0
Accepted
time: 5ms
memory: 3752kb
input:
2000 2000 0 1 1 0 0 0 0 1 1 2 0 2 1 2 0 0 0 0 1 0 0 1 2 0 1 1 0 0 1 2 1 1 2 2 2 1 1 2 0 2 2 0 1 0 1 2 2 0 2 0 0 2 0 1 2 2 0 1 0 1 0 1 0 2 0 2 1 2 1 1 0 1 2 0 1 1 1 2 0 2 1 1 2 1 2 0 1 0 0 0 0 2 2 0 2 2 0 2 2 1 0 1 2 1 0 2 0 1 1 2 2 0 0 0 0 2 0 2 2 1 1 1 2 2 0 1 2 0 2 1 0 1 1 2 2 2 0 0 0 0 1 0 0 2 1 ...
output:
679 679 679 679 679 679 679 678 679 678 678 678 679 678 679 678 678 678 678 678 677 678 677 678 678 678 679 678 678 678 678 678 677 677 677 678 677 678 678 678 678 678 678 678 679 678 679 679 679 680 680 680 680 680 680 679 678 677 676 677 676 676 677 676 675 674 674 674 674 674 674 673 673 672 672 ...
result:
ok 2000 numbers
Test #30:
score: 0
Accepted
time: 119ms
memory: 6188kb
input:
10 200000 1 2 2 2 2 1 0 2 2 2 10 -1 3 0 5 0 10 -1 10 0 3 0 5 0 7 1 9 -2 10 2 2 -2 6 -1 6 0 8 -1 4 -2 2 0 5 -1 8 1 1 1 4 1 1 -2 3 0 4 1 9 0 9 0 6 1 7 -1 4 -2 2 1 6 0 8 0 3 0 5 -1 10 -1 5 2 9 1 1 0 6 -1 2 0 9 1 2 1 4 2 5 -2 7 1 3 0 1 2 9 0 5 1 1 -1 6 2 6 -2 9 -1 8 -2 6 1 2 -2 1 -1 10 -1 2 0 8 2 6 -1 2...
output:
5 5 5 4 4 4 4 5 4 5 4 4 4 3 3 3 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 2 2 3 3 3 3 3 3 3 4 3 4 4 4 4 5 4 5 4 4 3 3 2 2 2 2 3 3 3 3 2 3 2 2 2 2 2 2 2 3 3 3 2 2 2 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 3 3 3 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 4 4 4 3 3 4 ...
result:
ok 200000 numbers
Test #31:
score: 0
Accepted
time: 958ms
memory: 17100kb
input:
200000 200000 2 0 1 2 2 0 2 0 1 1 1 2 0 1 1 0 1 2 2 1 1 0 0 1 0 1 0 1 0 2 1 1 2 0 2 2 2 2 2 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 2 1 2 1 0 1 1 2 0 2 2 0 0 0 1 2 1 2 0 0 0 0 2 2 2 0 2 1 1 1 0 0 0 2 1 1 0 1 0 1 1 2 2 1 1 1 0 2 2 2 2 0 2 1 1 0 0 1 2 0 2 0 2 1 0 2 0 0 1 1 0 1 0 2 0 1 2 0 2 0 1 2 0 2 1 ...
output:
66738 66738 66738 66738 66738 66739 66739 66739 66740 66739 66739 66739 66738 66739 66740 66739 66738 66739 66738 66738 66738 66739 66739 66739 66738 66739 66739 66738 66738 66737 66736 66736 66736 66737 66736 66735 66736 66735 66735 66736 66736 66736 66736 66735 66734 66733 66733 66733 66732 66732 ...
result:
ok 200000 numbers
Test #32:
score: 0
Accepted
time: 927ms
memory: 17108kb
input:
200000 200000 2 1 1 1 1 2 0 0 1 2 1 0 0 2 2 1 0 0 1 1 0 1 2 0 1 0 2 0 1 2 2 2 2 0 0 1 2 2 1 2 1 2 1 2 0 0 0 0 2 0 2 2 0 2 2 1 2 2 1 1 2 0 0 0 0 1 0 0 2 1 1 2 2 1 1 0 1 0 0 2 2 0 0 2 1 2 1 1 2 1 0 1 2 1 2 1 1 2 1 1 1 1 2 2 2 1 1 2 0 1 0 2 0 2 2 2 2 1 0 1 1 0 0 0 2 2 2 2 2 0 1 0 0 2 1 0 2 2 2 2 2 2 2 ...
output:
66650 66650 66650 66650 66650 66650 66650 66650 66651 66650 66649 66649 66649 66648 66648 66648 66648 66648 66648 66648 66647 66646 66647 66647 66648 66648 66648 66648 66649 66649 66649 66649 66649 66649 66648 66648 66648 66649 66649 66648 66648 66648 66648 66648 66648 66647 66647 66647 66648 66647 ...
result:
ok 200000 numbers
Test #33:
score: 0
Accepted
time: 932ms
memory: 17892kb
input:
200000 200000 0 1 2 1 1 1 1 0 2 2 2 1 0 2 2 1 0 1 0 1 1 2 0 0 0 2 0 0 2 0 2 0 0 1 0 2 0 1 0 2 1 0 2 2 1 0 0 1 2 0 1 0 1 2 0 0 2 0 2 1 2 2 2 1 1 2 1 0 2 1 0 0 1 2 1 1 0 1 0 0 2 0 0 0 2 1 0 1 0 2 0 1 1 0 2 0 0 0 1 2 2 0 2 0 0 0 2 1 1 1 2 1 2 2 2 1 0 1 1 2 0 2 2 2 1 1 0 0 1 1 2 0 2 1 1 0 2 2 1 0 2 2 1 ...
output:
66621 66621 66621 66621 66621 66621 66621 66621 66622 66622 66622 66622 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66621 66622 66622 66623 66623 66622 66622 66623 66623 66623 66622 66622 66622 66622 66622 66622 66622 66622 ...
result:
ok 200000 numbers
Test #34:
score: 0
Accepted
time: 711ms
memory: 16564kb
input:
200000 200000 2 0 0 2 2 0 2 0 2 0 0 0 2 2 0 0 1 0 0 2 1 2 1 2 0 0 2 0 2 0 0 0 0 1 2 0 2 0 1 2 0 2 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 2 2 0 1 1 0 0 0 1 1 2 0 2 0 1 0 2 2 0 0 2 1 2 0 2 0 1 0 2 2 0 0 2 1 0 0 2 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 2 0 2 1 0 0 0 0 0 2 1 1 0 1 0 0 2 2 0 2 0 0 2 0 1 0 0 2 0 0 1 1 ...
output:
49939 49939 49939 49938 49938 49939 49939 49939 49939 49939 49939 49939 49940 49940 49940 49940 49940 49940 49941 49940 49940 49940 49941 49940 49941 49941 49941 49941 49941 49941 49942 49941 49942 49942 49942 49942 49943 49943 49943 49943 49943 49943 49943 49943 49943 49944 49945 49945 49945 49945 ...
result:
ok 200000 numbers
Subtask #4:
score: 0
Wrong Answer
Test #35:
score: 0
Wrong Answer
time: 4ms
memory: 3600kb
input:
2000 1999 0 1 0 3 0 1 0 0 0 0 0 0 0 2 0 0 0 0 3 1 1 0 2 0 0 3 0 0 0 0 0 4 0 0 1 0 1 0 0 0 0 1 2 1 0 0 0 0 7 0 1 3 1 0 1 1 0 3 2 1 0 1 1 3 3 1 0 2 0 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 0 0 1 2 3 0 1 0 3 3 0 0 0 0 1 0 1 2 0 0 2 2 0 1 2 1 2 0 0 0 1 1 0 1 2 0 0 0 0 2 0 5 0 0 0 0 0 1 0 0 2 0 1 2 0 1 0 0 0 2 0 ...
output:
238 238 238 238 239 239 239 239 239 240 240 240 240 241 241 240 239 239 239 240 241 240 239 239 238 238 237 237 237 237 238 238 239 239 239 239 239 239 239 239 238 238 237 237 237 237 238 238 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 241 242 242 242 242 242 243 243 243 243 243 ...
result:
wrong answer 1st numbers differ - expected: '666', found: '238'
Subtask #5:
score: 0
Skipped
Dependency #1:
0%