QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#208636 | #6672. Colorful Segments | PetroTarnavskyi# | AC ✓ | 446ms | 8788kb | C++17 | 3.1kb | 2023-10-09 19:32:17 | 2023-10-09 19:32:17 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a) - 1; i >= (b); i--)
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
const int mod = 998244353;
const int N = 1 << 18;
void updAdd(int& x, int val)
{
x += val;
if (x >= mod)
x -= mod;
}
int add(int a, int b)
{
return a + b < mod ? a + b : a + b - mod;
}
int mult(int a, int b)
{
return (LL)a * b % mod;
}
struct SegTree
{
int t[N];
int lazy[N];
void build(int v, int tl, int tr)
{
t[v] = 0;
lazy[v] = 1;
if (tr == tl + 1)
return;
int tm = (tl + tr) / 2;
build(2 * v + 1, tl, tm);
build(2 * v + 2, tm, tr);
}
void push(int v)
{
if (2 * v < N)
{
FOR(i, 1, 3)
lazy[2 * v + i] = mult(lazy[2 * v + i], lazy[v]);
}
t[v] = mult(t[v], lazy[v]);
lazy[v] = 1;
}
void updAssign(int v, int tl, int tr, int pos, int val)
{
push(v);
if (tr == tl + 1)
{
t[v] = val;
return;
}
int tm = (tl + tr) / 2;
if (pos < tm)
updAssign(2 * v + 1, tl, tm, pos, val);
else
updAssign(2 * v + 2, tm, tr, pos, val);
t[v] = add(t[2 * v + 1], t[2 * v + 2]);
}
void updMult(int v, int tl, int tr, int l, int r)
{
push(v);
if (tr <= l || r <= tl)
return;
if (l <= tl && tr <= r)
{
lazy[v] = 2;
push(v);
return;
}
int tm = (tl + tr) / 2;
updMult(2 * v + 1, tl, tm, l, r);
updMult(2 * v + 2, tm, tr, l, r);
t[v] = add(t[2 * v + 1], t[2 * v + 2]);
}
int query(int v, int tl, int tr, int l, int r)
{
push(v);
if (tr <= l || r <= tl)
return 0;
if (l <= tl && tr <= r)
return t[v];
int tm = (tl + tr) / 2;
return add(query(2 * v + 1, tl, tm, l, r), query(2 * v + 2, tm, tr, l, r));
}
} st[2];
void solve()
{
int n;
cin >> n;
vector<PII> segs[2];
FOR(i, 0, 2)
segs[i] = {{0, 0}};
FOR(i, 0, n)
{
int l, r, c;
cin >> l >> r >> c;
segs[c].PB({r, l});
}
vector<int> dp[2];
FOR(i, 0, 2)
{
sort(ALL(segs[i]));
dp[i].resize(SZ(segs[i]));
dp[i][0] = 1;
st[i].build(0, 0, SZ(dp[i]));
st[i].updAssign(0, 0, SZ(dp[i]), 0, 1);
}
int ptr[2] = {1, 1};
int ans = 1;
while (ptr[0] < SZ(dp[0]) || ptr[1] < SZ(dp[1]))
{
int k = ptr[1] < SZ(dp[1]) && (ptr[0] == SZ(dp[0]) || segs[1][ptr[1]] < segs[0][ptr[0]]);
int j = lower_bound(ALL(segs[k ^ 1]), MP(segs[k][ptr[k]].S, 0)) - segs[k ^ 1].begin();
int cur = st[k ^ 1].query(0, 0, SZ(dp[k ^ 1]), 0, j);
st[k].updAssign(0, 0, SZ(dp[k]), ptr[k], cur);
st[k ^ 1].updMult(0, 0, SZ(dp[k ^ 1]), 0, j);
ptr[k]++;
updAdd(ans, cur);
//cerr << k << " " << ptr[k] - 1 << " " << segs[k][ptr[k] - 1].S << " " << segs[k][ptr[k] - 1].F << " " << cur << endl;
}
cout << ans << "\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(15);
int t;
cin >> t;
while(t--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5652kb
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: 167ms
memory: 6116kb
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: 446ms
memory: 8372kb
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: 178ms
memory: 7488kb
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: 372ms
memory: 8788kb
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"