QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#293831#2677. JOJOyhk1001100 ✓72ms129636kbC++147.8kb2023-12-29 20:30:392023-12-29 20:30:41

Judging History

你现在查看的是最新测评结果

  • [2023-12-29 20:30:41]
  • 评测
  • 测评结果:100
  • 用时:72ms
  • 内存:129636kb
  • [2023-12-29 20:30:39]
  • 提交

answer

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

// #define Debug

const int N = 1e5;
const int Base = 10001, V = 26 * Base, Lg = 18;//logV 
const long long P = 998244353;

int n;
int id[N + 5];

int c[N + 5], x[N + 5];

int head[N + 5], to[N + 5], nxt[N + 5], edge = 1;
void add_edge(int u, int v)
{
	edge++;
	to[edge] = v;
	nxt[edge] = head[u];
	head[u] = edge;
	return ;
}

namespace SegF
{
	const int SZ = N * Lg * 2;//at most modify N times, not V
	struct Node
	{
		int ls, rs, nxt;
	} node[SZ + 5];
	int tot;

	#define ls(p) node[p].ls
	#define rs(p) node[p].rs
	#define nxt(p) node[p].nxt

	int newnode()
	{
		return ++tot;
	}

	void modify(int p, int q, int l, int r, int pos, int val)
	{
		if (l == r)
			return nxt(p) = val, void();

		int mid = (l + r) >> 1;
		node[p] = node[q];

		if (pos <= mid)
		{
			ls(p) = newnode();
			modify(ls(p), ls(q), l, mid, pos, val);
		}
		else
		{
			rs(p) = newnode();
			modify(rs(p), rs(q), mid + 1, r, pos, val);
		}
		return ;
	}
	int query(int p, int l, int r, int pos)
	{
		if (l == r)
			return nxt(p);

		int mid = (l + r) >> 1;
		if (pos <= mid)
			return query(ls(p), l, mid, pos);
		return query(rs(p), mid + 1, r, pos);
	}

	#undef ls
	#undef rs
	#undef nxt
}

namespace SegG
{
	const int SZ = N * Lg * 10;
	struct Node
	{
		int ls, rs;
		int len, sum;
		int tag;
	} node[SZ + 5];
	int tot;

	#define ls(p) node[p].ls
	#define rs(p) node[p].rs
	#define len(p) node[p].len
	#define sum(p) node[p].sum
	#define tag(p) node[p].tag

	int newnode(int length)
	{
		int p = ++tot;
		len(p) = length;
		return p;
	}
	int copy(int p)
	{
		int np = ++tot;
		node[np] = node[p];
		return np;
	}

	void pushup(int p)
	{
		sum(p) = (sum(ls(p)) + sum(rs(p))) % P;
		return ;
	}
	void cover(int p, int val)
	{
		tag(p) = val;
		sum(p) = 1ll * len(p) * val % P;
		return ;
	}
	void pushdown(int p, int l, int r)
	{
		if (!tag(p))
			return ;

		int mid = (l + r) >> 1;

		if (!ls(p))
			ls(p) = newnode(mid - l + 1);
		else
			ls(p) = copy(ls(p));

		if (!rs(p))
			rs(p) = newnode(r - mid);
		else
			rs(p) = copy(rs(p));

		cover(ls(p), tag(p));
		cover(rs(p), tag(p));
		tag(p) = 0;
		return ;
	}

	void modify(int p, int q, int l, int r, int L, int R, int val)
	{
		// node[p] = node[q];

		#ifdef Debug
		if (len(p) != r - l + 1)
		{
			cerr << "Error" << endl;
			exit(0);
		}
		#endif

		ls(p) = ls(q), rs(p) = rs(q);

		if (L <= l && r <= R)
		{

			cover(p, val);

			#ifdef Debug
			if (val == 717479)
			{
				cerr << p << " " << q << " " << l << " " << r << " " << L << " " << R << " " << val << endl;
				cerr << tag(p) << " === " << tag(q) << endl;
				cerr << len(p) << " --- " << len(q) << endl;
				cerr << "sum = " << sum(p) << endl;
				cerr << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" << endl;
				cerr << endl;
			}
			#endif

			return ;

			// return cover(p, val), void();
		}

		int mid = (l + r) >> 1;
		pushdown(q, l, r);

		ls(p) = ls(q), rs(p) = rs(q);

		if (L <= mid)
		{
			ls(p) = newnode(mid - l + 1);
			
			modify(ls(p), ls(q), l, mid, L, R, val);
		}
		if (R > mid)
		{
			rs(p) = newnode(r - mid);
			modify(rs(p), rs(q), mid + 1, r, L, R, val);
		}
		pushup(p);


		#ifdef Debug
		if (val == 717479)
		{
			cerr << p << " " << q << " " << l << " " << r << " " << L << " " << R << " " << val << endl;
			cerr << tag(p) << " === " << tag(q) << endl;
			cerr << len(p) << " --- " << len(q) << endl;
			cerr << "sum = " << sum(p) << endl;
			cerr << endl;

			if (p == 5155)
			{
				cerr << ls(p) << " " << rs(p) << endl;
				cerr << sum(ls(p)) << " " << sum(rs(p)) << endl;
			}
		}
		#endif

		return ;
	}
	int query(int p, int l, int r, int L, int R)
	{

		#ifdef Debug
		if (L == 4 * Base + 1 && R == 4 * Base + 4008)
		{
			cerr << p << " " << l << " " << r << " " << L << " " << R << endl;
			cerr << len(p) << " " << sum(p) << endl;
			cerr << ls(p) << " " << rs(p) << endl;
			cerr << tag(p) << endl;
			cerr << endl;
		}
		#endif

		if (L <= l && r <= R)
			return sum(p);
		
		int mid = (l + r) >> 1, res = 0;


		#ifdef Debug
		if (mid - l + 1 > r - mid)
		{
			// cerr << l << " ================================= " << r << endl;
			// exit(0);
		}
		#endif

		pushdown(p, l, r);

		if (L <= mid && ls(p))
			res = query(ls(p), l, mid, L, R);
		if (R > mid && rs(p))
			res = (res + query(rs(p), mid + 1, r, L, R)) % P;
		return res;
	}

	void checkSeg(int p, int l, int r)
	{
		if (!p)
			return ;
		if (len(p) != r - l + 1)
		{
			cerr << "len != r - l + 1 !!!! Error" << endl;
			cerr << p << endl;
			exit(0);
		}
		if (l == r)
			return ;
		int mid = (l + r) >> 1;
		checkSeg(ls(p), l, mid);
		checkSeg(rs(p), mid + 1, r);
		return ;
	}

	#undef ls
	#undef rs
}

int ans[N + 5];

int rootF[N + 5], rootG[N + 5];
int mx[N + 5][30];

int calc(int length)
{
	return 1ll * length * (length + 1) / 2 % P;
}

void dfs(int u, int fa, int rt, int len)
{
	int zero = (c[u] - 1) * Base, pos = zero + x[u];

	int match = min(x[u], mx[fa][c[u]]);
	
	int fail = SegF :: query(rootF[fa], 1, V, pos);
	if (!fail && u != rt && c[u] == c[rt] && x[rt] < x[u])
		fail = rt;
	
	ans[u] = SegG :: query(rootG[fa], 1, V, zero + 1, pos);

	#ifdef Debug

	if (u > 686)
	{
		int res = SegG :: query(rootG[685], 1, V, 4 * Base + 1, 4 * Base + 4008);
		if (res != 402858218)
		{
			cerr << u << " error" << endl;
			exit(0);
		}
	}

	if (u == 823)
	{
		cerr << "rootG[fa] = " << rootG[fa] << endl;
		cerr << "ans = " << ans[u] << endl;
	}
	#endif

	ans[u] = (ans[u] + calc(match)) % P;

	#ifdef Debug
	#endif

	if (x[u] > match)//which means, x[rt] < x[u] if c[rt] = c[u]
	{
		if (u == rt)
			ans[u] = calc(x[u] - 1);
		else if (c[u] == c[rt])
			ans[u] = (ans[u] + 1ll * (x[u] - match) * x[rt] % P) % P;
		else
			{;}
	}

	#ifdef Debug
	if (u == 823)
	{
		cerr << ans[u] << endl;
	}
	#endif

	ans[u] = (ans[u] + ans[fa]) % P;

	#ifdef Debug
	if (u == 823)
	{
		cerr << ans[u] << endl;
	}
	#endif

	mx[fa][c[u]] = max(mx[fa][c[u]], x[u]);

	int tmp = rootF[fa];
	rootF[fa] = SegF :: newnode();
	SegF :: modify(rootF[fa], tmp, 1, V, pos, u);

	tmp = rootG[fa];
	rootG[fa] = SegG :: newnode(V);
	SegG :: modify(rootG[fa], tmp, 1, V, zero + 1, pos, len);

	#ifdef Debug
	if (u == 138)
	{
		cerr << u << ":" << endl;
		cerr << "tmp: " << tmp << endl;
		cerr << "modify: " << rootG[fa] << " " << tmp << " " << 1 << " " << V << " " <<
		zero + 1 << " " << pos << " " << len << endl;
		cerr << 4 * Base + 1 << " " << 4 * Base + 4008 << endl;
		cerr << "query::: " << SegG :: query(rootG[fa], 1, V, 4 * Base + 1, 4 * Base + 4008) << endl;

		cerr << SegF :: tot << " " << SegG :: tot << endl;
		SegG :: checkSeg(rootG[fa], 1, V);
		exit(0);
	}
	#endif

	for (int i = head[u]; i; i = nxt[i])
	{
		int v = to[i];

		memcpy(mx[u], mx[fail], sizeof(mx[u]));
		rootF[u] = rootF[fail];
		rootG[u] = rootG[fail];

		dfs(v, u, rt, len + x[u]);
	}
	return ;
}

int main()
{
	// freopen("jojo6.in", "r", stdin);
	// freopen("jojo.out", "w", stdout);

	scanf("%d", &n);
	for (int i = 1, opt; i <= n; i++)
	{
		scanf("%d", &opt);
		if (opt == 1)
		{
			char tmp;
			scanf("%d %c", x + i, &tmp);
			c[i] = tmp - 'a' + 1;

			id[i] = i;
			add_edge(id[i - 1], id[i]);
		}
		else
		{
			scanf("%d", x + i);
			id[i] = id[x[i]];
		}

		#ifdef Debug
		if (i == 823)
			break;
		#endif
	}

	for (int i = head[0]; i; i = nxt[i])
	{
		int v = to[i];
		
		rootF[0] = rootG[0] = 0;
		memset(mx[0], 0, sizeof(mx[0]));

		dfs(v, 0, v, 0);
	}
	for (int i = 1; i <= n; i++)
		printf("%d\n", ans[id[i]]);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 1ms
memory: 3940kb

input:

300
1 281 t
1 196 p
1 96 g
1 196 w
2 1
1 281 g
1 14 n
1 14 x
1 173 y
1 96 z
1 96 u
1 96 h
2 6
1 281 t
2 7
1 196 p
2 16
1 96 g
1 196 w
2 6
1 281 x
1 14 n
1 14 x
1 173 y
1 96 z
1 96 u
1 96 h
1 16 j
1 281 t
1 196 p
1 96 g
1 196 w
1 281 g
2 14
1 14 n
1 14 x
1 173 y
1 96 z
1 96 u
1 96 h
1 281 t
1 196 p
1...

output:

39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
78961
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
39340
78961
78961
78961
78961
78961
78961
78961
78961
78961
78961
78961
78961
118582
118582
118582
118582
118582
118582
118582
118582
1185...

result:

ok 300 numbers

Test #2:

score: 10
Accepted
time: 1ms
memory: 3960kb

input:

300
1 81 g
1 23 q
1 126 e
1 244 d
1 20 g
1 20 d
1 277 i
1 126 j
1 267 i
1 277 c
1 126 j
1 20 e
1 277 a
1 45 e
1 23 h
1 277 g
1 267 h
1 277 c
1 244 i
1 23 g
1 126 e
1 244 d
1 20 g
2 9
1 20 d
1 277 i
1 126 j
1 267 i
1 277 c
1 126 j
1 20 e
1 277 a
1 45 e
1 23 h
2 0
1 277 g
1 267 h
1 277 c
2 28
1 244 n
...

output:

3240
3240
3240
3240
3450
3450
3450
3450
3450
3450
3450
3450
3450
3450
3450
22647
22647
22647
22647
22923
22923
22923
23133
3450
3450
3450
3450
3450
3450
3450
3450
3450
3450
3450
0
38226
38226
38226
3450
3450
3726
3726
3726
3936
3936
3936
3450
3450
3450
3450
3450
3450
3450
3450
3450
22647
38226
38226...

result:

ok 300 numbers

Test #3:

score: 10
Accepted
time: 43ms
memory: 62836kb

input:

100000
1 1 c
1 1 v
1 1 u
1 1 f
1 1 g
1 1 l
1 1 c
1 1 a
1 1 j
1 1 c
1 1 y
1 1 l
1 1 n
1 1 u
1 1 o
1 1 u
2 0
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1...

output:

0
0
0
0
0
0
1
1
1
2
2
2
2
2
2
2
0
0
0
0
1
3
6
10
15
21
28
36
45
55
66
78
91
105
120
136
153
171
190
210
231
253
276
300
325
351
378
406
435
465
496
528
561
595
630
666
703
741
780
820
861
903
946
990
1035
1081
1128
1176
1225
1275
1326
1378
1431
1485
1540
1596
1653
1711
1770
1830
1891
1953
2016
2080
...

result:

ok 100000 numbers

Test #4:

score: 10
Accepted
time: 48ms
memory: 62912kb

input:

100000
1 1 q
1 1 w
1 1 e
2 1
1 1 s
1 1 n
1 1 i
1 1 l
1 1 d
1 1 x
1 1 f
1 1 s
1 1 p
1 1 y
1 1 d
1 1 b
1 1 v
1 1 i
1 1 q
1 1 t
1 1 i
1 1 r
1 1 e
1 1 r
1 1 e
1 1 t
2 18
1 1 p
1 1 f
1 1 p
1 1 t
1 1 c
1 1 q
1 1 v
1 1 z
1 1 v
1 1 x
1 1 u
1 1 x
1 1 h
1 1 b
1 1 v
1 1 c
1 1 a
1 1 x
1 1 c
1 1 a
1 1 g
1 1 a
1 ...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
3
6
...

result:

ok 100000 numbers

Test #5:

score: 10
Accepted
time: 38ms
memory: 62604kb

input:

100000
1 1 c
1 1 t
1 1 f
1 1 t
1 1 y
1 1 j
1 1 w
1 1 k
1 1 r
1 1 w
1 1 c
1 1 z
1 1 s
1 1 l
1 1 y
1 1 o
1 1 l
1 1 k
1 1 b
1 1 f
1 1 o
1 1 b
1 1 e
1 1 z
1 1 n
1 1 z
1 1 a
1 1 l
1 1 z
1 1 y
1 1 j
1 1 a
1 1 w
1 1 a
1 1 o
2 18
1 1 p
1 1 m
1 1 t
1 1 i
1 1 v
1 1 c
1 1 m
1 1 l
1 1 f
1 1 s
1 1 r
1 1 q
1 1 f
...

output:

0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
2
2
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
4
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
7
7
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
...

result:

ok 100000 numbers

Test #6:

score: 10
Accepted
time: 60ms
memory: 126920kb

input:

100000
1 7564 e
1 1730 a
1 6135 b
1 8268 c
1 1730 d
1 2067 a
1 2067 b
1 2067 e
1 2067 a
1 7246 b
1 7246 d
1 7564 a
1 8268 d
1 6135 e
1 8268 a
1 1730 c
1 7246 d
1 1730 c
1 8268 e
1 6135 b
1 6135 a
1 8268 c
1 8268 e
1 7246 a
1 7564 d
1 8268 e
1 6135 d
1 2067 b
1 4008 a
1 7564 c
1 1962 a
1 6135 c
1 196...

output:

28603266
28603266
28603266
28603266
28603266
28603266
28603266
30740544
30740544
30740544
30740544
30740544
30740544
49562724
49562724
49562724
49562724
49562724
83498610
83498610
83498610
83498610
117434496
132017531
132017531
165953417
165953417
165953417
165953417
165953417
165953417
165953417
16...

result:

ok 100000 numbers

Test #7:

score: 10
Accepted
time: 67ms
memory: 129360kb

input:

100000
1 6850 f
1 2649 g
1 3685 i
1 3685 x
1 7360 y
1 2752 q
1 6850 g
1 2649 k
1 6850 g
1 2649 i
1 8846 e
1 2649 d
1 6850 n
1 3685 h
1 2752 n
1 1911 m
1 2752 q
1 2752 c
1 3685 m
1 3685 z
1 8846 y
1 2649 f
1 8846 w
1 604 a
1 1911 g
1 2752 r
1 604 h
1 7360 p
1 8846 o
1 2649 m
1 3685 q
1 3685 d
1 2649 ...

output:

23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
23457825
26967750
26967750
26967750
26967750
26967750
26967750
26967750
26967750
26967750
26967750
26967750
26967750
269...

result:

ok 100000 numbers

Test #8:

score: 10
Accepted
time: 72ms
memory: 129636kb

input:

100000
1 1420 w
1 7901 g
1 4938 t
1 7901 m
1 4092 k
1 3443 g
1 6147 o
1 1420 d
1 3443 p
1 2296 m
1 7901 n
1 3443 l
1 1420 b
1 3443 a
1 6147 j
1 6570 c
1 7901 n
1 4092 e
1 4092 h
1 1420 w
1 6570 t
1 4092 x
1 3443 w
1 6570 p
1 4938 i
1 6570 p
1 6570 m
1 2296 h
1 7901 e
1 2296 i
1 1420 s
1 1420 l
1 493...

output:

1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
1007490
2016400
2016400
2016400
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897970
5897...

result:

ok 100000 numbers

Test #9:

score: 10
Accepted
time: 45ms
memory: 64580kb

input:

100000
1 1145 f
1 6117 p
1 6262 h
1 6136 o
1 1145 d
1 1668 r
1 4942 e
1 1145 a
1 6262 j
1 6262 t
1 1440 b
1 764 n
1 1145 v
1 764 k
1 3592 i
1 764 p
1 4915 k
1 1440 q
1 1440 g
1 4942 f
1 8963 a
1 9641 t
1 9392 o
2 0
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1 1 a
1 1 b
1 1 c
1...

output:

654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
654940
5658590
5658590
5658590
5658590
0
0
0
0
1
3
6
10
15
21
28
36
45
55
66
78
91
105
120
136
153
171
190
210
231
253
276
300
325
351
378
406
435
465
496
528
561
595
630
666...

result:

ok 100000 numbers

Test #10:

score: 10
Accepted
time: 43ms
memory: 64520kb

input:

100000
1 8697 e
1 3699 h
1 2576 x
1 1733 l
1 2576 p
1 3699 g
1 2330 j
1 8697 d
1 3699 e
1 8697 v
1 1733 b
1 2330 o
1 8697 e
1 2004 l
1 6142 t
1 4498 l
1 2843 c
1 2004 i
1 8697 w
1 1463 l
1 1733 a
1 7185 b
1 2576 r
1 6142 c
1 7185 w
1 6142 j
1 2330 i
1 7185 x
1 8697 t
1 2863 k
1 4498 c
1 1733 d
1 146...

output:

37814556
37814556
37814556
37814556
37814556
37814556
37814556
37814556
44657706
44657706
44657706
44657706
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
82480959
824...

result:

ok 100000 numbers