CF1264C Beautiful Mirrors with queries

走$n$个点,在某个点,有$p_i$概率使你通过,$1-p_i$回到上一重生点。

有$q$个修改把某个点改复活点或者取消复活点。

考虑没有修改的情况。
$E(x)$为通过第$i$期望天数。

所以可以写出某段区间$[l,r]$,复活点为$l$。

前面一部分可前缀和预处理。

对于修改部分找到影响的区间$[l,r)$,多出来$f[l,x),f[x,r)$,减少了$f[l,r)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int N = 2e5 + 10;
const int mod = 998244353;

int addmod(int x, int y)
{
if (y < 0)
y += mod;
if (x + y >= mod)
x -= mod;
return x + y;
}
int qpow(int a, int b, int mo)
{
int res = 1;
while (b)
{
if (b & 1)
res = 1ll * res * a % mo;
a = 1ll * a * a % mo;
b >>= 1;
}
return res;
}

int sum[N], inv[N], p[N], pp[N], n, q, vis[N];
int calc(int l, int r)
{
return 1ll * addmod(sum[l], -sum[r]) * inv[r] % mod;
}
set<int> ss;
int ans = 0;
int main()
{
//freopen("r.txt", "r", stdin);
//cout << 233 << endl;
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
{
scanf("%d", &p[i]);
p[i] = 100ll * qpow(p[i], mod - 2, mod) % mod;
}
pp[n + 1] = 1;
inv[n + 1] = 1;
sum[n + 1] = 0;
for (int i = n; i >= 1; i--)
{
pp[i] = 1ll * pp[i + 1] * p[i] % mod;
sum[i] = addmod(sum[i + 1], pp[i]);
}
//cout << pp[1] << endl;
for (int i = 1; i <= n; i++)
inv[i] = qpow(pp[i], mod - 2, mod);
ss.insert(1);
ss.insert(n + 1);
ans = sum[1];
//cout << 233 << endl;
for (int i = 1; i <= q; i++)
{
int x;
scanf("%d", &x);
vis[x] ^= 1;
if (vis[x])
{
int l = *--ss.lower_bound(x);
int r = *ss.lower_bound(x);

//cout << l << " " << r << endl;
ans = addmod(ans, -calc(l, r));
//cout << ans << endl;
ans = addmod(ans, calc(l, x));
ans = addmod(ans, calc(x, r));
ss.insert(x);
}
else
{
int l = *--ss.lower_bound(x);
int r = *++ss.lower_bound(x);

ans = addmod(ans, calc(l, r));
ans = addmod(ans, -calc(l, x));
ans = addmod(ans, -calc(x, r));
ss.erase(x);
}
printf("%d\n", ans);
}
}