QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#117810 | #6672. Colorful Segments | Irisu | AC ✓ | 414ms | 9304kb | C++20 | 7.5kb | 2023-07-02 09:27:58 | 2023-07-02 09:28:01 |
Judging History
answer
// test
// code from larryzhong
#include <bits/stdc++.h>
using namespace std;
constexpr int P = 998244353;
template <class T> T qp(T a, int b) {
T c{1};
for (; b; b /= 2, a *= a) {
if (b % 2) {
c *= a;
}
}
return c;
}
struct mint {
int x;
mint(int _x = 0) : x(_x % P) { x < 0 ? x += P : 0; }
int val() const { return x; }
mint operator - () const {
return -x;
}
mint inv() const {
assert(x != 0);
return qp(*this, P - 2);
}
mint &operator += (const mint &rhs) {
x += rhs.x - P, x += x >> 31 & P;
return *this;
}
mint &operator -= (const mint &rhs) {
x -= rhs.x, x += x >> 31 & P;
return *this;
}
mint &operator *= (const mint &rhs) {
x = (long long)x * rhs.x % P;
return *this;
}
mint &operator /= (const mint &rhs) {
return *this *= rhs.inv();
}
friend mint operator + (mint lhs, const mint &rhs) {
return lhs += rhs;
}
friend mint operator - (mint lhs, const mint &rhs) {
return lhs -= rhs;
}
friend mint operator * (mint lhs, const mint &rhs) {
return lhs *= rhs;
}
friend mint operator / (mint lhs, const mint &rhs) {
return lhs /= rhs;
}
friend ostream &operator << (ostream &os, const mint &a) {
return os << a.val();
}
};
template <class S, S (*op)(S, S), S (*e)(),
class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()>
struct lazy_segtree {
public:
lazy_segtree() : lazy_segtree(0) {}
explicit lazy_segtree(int n) : lazy_segtree(vector<S>(n, e())) {}
explicit lazy_segtree(const vector<S> &v) : _n(int(v.size())) {
log = _n != 0 ? 32 - __builtin_clz(_n - 1) : 0;
size = 1 << log;
d = vector<S>(2 * size, e());
lz = vector<F>(size, id());
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) {
assert(0 <= p && p < _n);
p += size;
for (int i = log; i >= 1; i--) push(p >> i);
d[p] = x;
for (int i = 1; i <= log; i++) update(p >> i);
}
S get(int p) {
assert(0 <= p && p < _n);
p += size;
for (int i = log; i >= 1; i--) push(p >> i);
return d[p];
}
S prod(int l, int r) {
assert(0 <= l && l <= r && r <= _n);
if (l == r) return e();
l += size;
r += size;
for (int i = log; i >= 1; i--) {
if (((l >> i) << i) != l) push(l >> i);
if (((r >> i) << i) != r) push((r - 1) >> i);
}
S sml = e(), smr = e();
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);
}
S all_prod() { return d[1]; }
void apply(int p, F f) {
assert(0 <= p && p < _n);
p += size;
for (int i = log; i >= 1; i--) push(p >> i);
d[p] = mapping(f, d[p]);
for (int i = 1; i <= log; i++) update(p >> i);
}
void apply(int l, int r, F f) {
assert(0 <= l && l <= r && r <= _n);
if (l == r) return;
l += size;
r += size;
for (int i = log; i >= 1; i--) {
if (((l >> i) << i) != l) push(l >> i);
if (((r >> i) << i) != r) push((r - 1) >> i);
}
{
int l2 = l, r2 = r;
while (l < r) {
if (l & 1) all_apply(l++, f);
if (r & 1) all_apply(--r, f);
l >>= 1;
r >>= 1;
}
l = l2;
r = r2;
}
for (int i = 1; i <= log; i++) {
if (((l >> i) << i) != l) update(l >> i);
if (((r >> i) << i) != r) update((r - 1) >> i);
}
}
template <bool (*g)(S)> int max_right(int l) {
return max_right(l, [](S x) { return g(x); });
}
template <class G> int max_right(int l, G g) {
assert(0 <= l && l <= _n);
assert(g(e()));
if (l == _n) return _n;
l += size;
for (int i = log; i >= 1; i--) push(l >> i);
S sm = e();
do {
while (l % 2 == 0) l >>= 1;
if (!g(op(sm, d[l]))) {
while (l < size) {
push(l);
l = (2 * l);
if (g(op(sm, d[l]))) {
sm = op(sm, d[l]);
l++;
}
}
return l - size;
}
sm = op(sm, d[l]);
l++;
} while ((l & -l) != l);
return _n;
}
template <bool (*g)(S)> int min_left(int r) {
return min_left(r, [](S x) { return g(x); });
}
template <class G> int min_left(int r, G g) {
assert(0 <= r && r <= _n);
assert(g(e()));
if (r == 0) return 0;
r += size;
for (int i = log; i >= 1; i--) push((r - 1) >> i);
S sm = e();
do {
r--;
while (r > 1 && (r % 2)) r >>= 1;
if (!g(op(d[r], sm))) {
while (r < size) {
push(r);
r = (2 * r + 1);
if (g(op(d[r], sm))) {
sm = op(d[r], sm);
r--;
}
}
return r + 1 - size;
}
sm = op(d[r], sm);
} while ((r & -r) != r);
return 0;
}
private:
int _n, size, log;
vector<S> d;
vector<F> lz;
void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
void all_apply(int k, F f) {
d[k] = mapping(f, d[k]);
if (k < size) lz[k] = composition(f, lz[k]);
}
void push(int k) {
all_apply(2 * k, lz[k]);
all_apply(2 * k + 1, lz[k]);
lz[k] = id();
}
};
mint op(mint l, mint r) { return l + r; }
mint e() { return 0; }
mint mapping(mint f, mint x) { return f * x; }
mint composition(mint f, mint g) { return f * g; }
mint id() { return 1; }
using segtree = lazy_segtree<mint, op, e, mint, mapping, composition, id>;
void solve() {
int n;
cin >> n;
vector<tuple<int, int, int>> seg(n);
for (auto &[l, r, c] : seg) {
cin >> l >> r >> c;
}
sort(seg.begin(), seg.end(), [&](const auto &p, const auto &q) {
return get<1>(p) < get<1>(q);
});
// vector tree(2, segtree(n));
vector<segtree> tree(2);
fill(tree.begin(), tree.end(), segtree(n));
// tree[0] = tree[1] = segtree(n); // ???
mint ans = 1;
array<mint, 2> ways{1, 1};
for (int i = 0; i < n; i++) {
auto [l, r, c] = seg[i];
mint s = ways[c];
int lo = 0, hi = i - 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (get<1>(seg[mid]) < l) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
s += tree[!c].prod(0, lo);
tree[!c].apply(0, lo, 2);
ans += s;
tree[c].set(i, s);
ways[c] *= 2;
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3464kb
input:
2 3 1 5 0 3 6 1 4 7 0 3 1 5 0 7 9 1 3 6 0
output:
5 8
result:
ok 2 number(s): "5 8"
Test #2:
score: 0
Accepted
time: 192ms
memory: 3828kb
input:
11120 9 336470888 481199252 1 642802746 740396295 1 396628655 579721198 0 202647942 971207868 1 46761498 268792718 0 16843338 125908043 1 717268783 787375312 0 519096230 693319712 1 762263554 856168102 1 5 274667941 279198849 0 155191459 421436316 1 140515506 286802932 0 233465964 451394766 1 105650...
output:
107 11 192 24 102 20 14 96 2 8 104 10 9 10 12 8 26 12 268 10 8 4 92 3 2 7 7 34 76 6 16 22 36 8 24 68 46 82 7 92 5 40 8 9 2 2 44 52 68 2 12 64 23 28 16 74 11 4 2 70 2 240 64 40 10 4 2 3 112 2 24 40 38 50 52 4 4 53 46 48 10 4 56 268 22 8 48 42 12 40 12 96 44 8 200 7 8 2 6 35 17 258 44 84 85 10 3 28 2 ...
result:
ok 11120 numbers
Test #3:
score: 0
Accepted
time: 414ms
memory: 9304kb
input:
5 100000 54748096 641009859 1 476927808 804928248 1 503158867 627937890 0 645468307 786026685 1 588586447 939887597 0 521365644 710156469 1 11308832 860350786 0 208427221 770562147 0 67590963 726478310 0 135993561 255361535 0 46718075 851555000 1 788412453 946936715 1 706350235 771067386 0 16233727 ...
output:
357530194 516871115 432496137 637312504 617390759
result:
ok 5 number(s): "357530194 516871115 432496137 637312504 617390759"
Test #4:
score: 0
Accepted
time: 390ms
memory: 9280kb
input:
5 100000 848726907 848750009 0 297604744 297778695 0 838103430 838114282 0 39072414 39078626 0 600112362 600483555 0 792680646 792687230 0 580164077 580183653 0 921627432 921685087 0 308067290 308143197 0 111431618 111465177 0 626175211 626270895 0 593284132 593292158 0 497427809 497437386 0 3493551...
output:
538261388 538261388 538261388 538261388 538261388
result:
ok 5 number(s): "538261388 538261388 538261388 538261388 538261388"
Test #5:
score: 0
Accepted
time: 369ms
memory: 9256kb
input:
5 100000 49947 49948 1 44822 44823 0 91204 91205 0 46672 46673 1 18538 18539 1 25486 25487 1 68564 68565 1 63450 63451 1 4849 4850 1 85647 85648 1 6019 6020 0 81496 81497 0 62448 62449 1 50039 50040 1 67911 67912 1 64304 64305 0 68727 68728 0 22340 22341 0 27265 27266 1 74123 74124 0 92270 92271 0 2...
output:
688810885 178370005 333760229 155298895 925722609
result:
ok 5 number(s): "688810885 178370005 333760229 155298895 925722609"