QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#67523#2677. JOJOalpha1022100 ✓64ms74460kbC++203.5kb2022-12-10 16:56:312022-12-10 16:56:32

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-12-10 16:56:32]
  • 评测
  • 测评结果:100
  • 用时:64ms
  • 内存:74460kb
  • [2022-12-10 16:56:31]
  • 提交

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