QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#293831 | #2677. JOJO | yhk1001 | 100 ✓ | 72ms | 129636kb | C++14 | 7.8kb | 2023-12-29 20:30:39 | 2023-12-29 20:30:41 |
Judging History
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;
}
详细
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