QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#67523 | #2677. JOJO | alpha1022 | 100 ✓ | 64ms | 74460kb | C++20 | 3.5kb | 2022-12-10 16:56:31 | 2022-12-10 16:56:32 |
Judging History
answer
#include <cstdio>
#include <cassert>
#include <utility>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5;
const int X = 1e4;
const int mod = 998244353;
int n;
int to[N + 5], pre[N + 5], first[N + 5];
inline void add(int u, int v) {
static int tot = 0;
to[++tot] = v, pre[tot] = first[u], first[u] = tot;
}
struct note {
int x, c;
} a[N + 5];
int id[N + 5], ans[N + 5], len[N + 5];
int mx[N + 5][26], rt[N + 5][26];
inline int calc(int n) {
return ((long long)n * (n + 1) >> 1) % mod;
}
struct node {
int sum, tag;
int nxt;
int ls, rs;
} seg[(N << 7) + 5];
int seg_tot;
inline void push(int p, int tl, int tr) {
int &tot = seg_tot;
int mid = tl + tr >> 1;
if (seg[p].tag)
seg[++tot] = seg[seg[p].ls], seg[seg[p].ls = tot].sum = (long long)seg[p].tag * (mid - tl + 1) % mod,
seg[seg[p].ls].tag = seg[p].tag,
seg[++tot] = seg[seg[p].rs], seg[seg[p].rs = tot].sum = (long long)seg[p].tag * (tr - mid) % mod,
seg[seg[p].rs].tag = seg[p].tag,
seg[p].tag = 0;
}
void update(int r, int k, int nxt, int &p, int tl, int tr) {
int &tot = seg_tot;
seg[++tot] = seg[p], p = tot;
if (tr < r) {
seg[p].sum = (long long)k * (tr - tl + 1) % mod, seg[p].tag = k;
return ;
}
if (tl == tr) {
seg[p].sum = (long long)k * (tr - tl + 1) % mod, seg[p].tag = k, seg[p].nxt = nxt;
return ;
}
push(p, tl, tr);
int mid = tl + tr >> 1;
update(r, k, nxt, seg[p].ls, tl, mid);
r > mid &&(update(r, k, nxt, seg[p].rs, mid + 1, tr), 1);
seg[p].sum = (seg[seg[p].ls].sum + seg[seg[p].rs].sum) % mod;
}
inline pair<int, int> operator+(const pair<int, int> &a, const pair<int, int> &b) {
return make_pair((a.first + b.first) % mod, a.second | b.second);
}
pair<int, int> query(int r, int p, int tl, int tr) {
if (tr < r)
return make_pair(seg[p].sum, 0);
if (tl == tr)
return make_pair(seg[p].sum, seg[p].nxt);
push(p, tl, tr);
int mid = tl + tr >> 1;
pair<int, int> ret(0, 0);
ret = ret + query(r, seg[p].ls, tl, mid);
r > mid &&(ret = ret + query(r, seg[p].rs, mid + 1, tr), 1);
return ret;
}
int s[N + 5], top;
void dfs(int i) {
s[++top] = i;
int nxt = 0;
len[i] = (len[s[top - 1]] + a[i].x) % mod;
if (top == 1)
ans[i] = calc(len[i] - 1);
else {
ans[i] = (ans[i] + calc(min(mx[i][a[i].c], a[i].x))) % mod;
pair<int, int> t = query(a[i].x, rt[i][a[i].c], 1, X);
ans[i] = (ans[i] + t.first) % mod, nxt = t.second;
if (!nxt && a[i].c == a[s[1]].c && a[i].x > a[s[1]].x)
nxt = 1, ans[i] = (ans[i] + (long long)a[s[1]].x * max(0, a[i].x - mx[i][a[i].c])) % mod;
}
mx[i][a[i].c] = max(mx[i][a[i].c], a[i].x), update(a[i].x, len[s[top - 1]], top, rt[i][a[i].c], 1, X);
for (register int j = first[i]; j; j = pre[j])
memcpy(mx[to[j]], mx[s[nxt + 1]], sizeof mx[to[j]]), memcpy(rt[to[j]], rt[s[nxt + 1]], sizeof rt[to[j]]),
ans[to[j]] = ans[i], dfs(to[j]);
--top;
}
int main() {
scanf("%d", &n);
char op, c;
int x;
for (register int i = 1, cur = 0; i <= n; ++i) {
scanf(" %c%d", &op, &x);
if (op == '1')
scanf(" %c", &c), a[i].x = x, a[i].c = c - 'a', add(cur, i), cur = id[i] = i;
else
cur = id[i] = id[x];
}
for (register int i = first[0]; i; i = pre[i])
dfs(to[i]);
for (register int i = 1; i <= n; ++i)
printf("%d\n", ans[id[i]]);
}
詳細信息
Test #1:
score: 10
Accepted
time: 2ms
memory: 1836kb
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: 1804kb
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: 55ms
memory: 48796kb
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: 63ms
memory: 48776kb
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: 45ms
memory: 48808kb
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: 61ms
memory: 73396kb
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: 51ms
memory: 74460kb
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: 47ms
memory: 72952kb
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: 63ms
memory: 49416kb
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: 64ms
memory: 49340kb
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