QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#208636#6672. Colorful SegmentsPetroTarnavskyi#AC ✓446ms8788kbC++173.1kb2023-10-09 19:32:172023-10-09 19:32:17

Judging History

This is the latest submission verdict.

  • [2023-10-09 19:32:17]
  • Judged
  • Verdict: AC
  • Time: 446ms
  • Memory: 8788kb
  • [2023-10-09 19:32:17]
  • Submitted

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"