死活调不出来,求大佬帮助,取模应该没问题吧
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5 + 5, mod = 998244353, N = 1e4;
struct node {
int l, r, val;
};
int rt[maxn], ans[maxn];
struct Segtree {
node tr[maxn * 50];
int tot, tag[maxn * 50];
int newnode() {
tag[++tot] = 1;
return tot;
}
void pushup(int t) {
tr[t].val = tr[tr[t].l].val + tr[tr[t].r].val, tr[t].val %= mod;
}
int modify(int l, int r, int pos, int t, int val) {
if(!t)
t = newnode();
if(l == r) {
tr[t].val = val;
return t;
}
int mid = l + r >> 1;
if(pos <= mid)
tr[t].l = modify(l, mid, pos, tr[t].l, val);
else
tr[t].r = modify(mid + 1, r, pos, tr[t].r, val);
// cout << l << " " << r << " " << tr[t].l << " " << tr[t].r << endl;
pushup(t);
return t;
}
void addtag(int l, int r, int t, int v) {
if(!t)
return ;
tr[t].val = tr[t].val * v % mod;
tag[t] = tag[t] * v % mod;
}
void pushdown(int l, int r, int t) {
addtag(l, r, tr[t].l, tag[t]);
addtag(l, r, tr[t].r, tag[t]);
tag[t] = 1;
}
int mrg(int l, int r, int x, int y, int xval, int yval, int val) {
if(!x && !y)
return 0;
if(!x) {
addtag(l, r, y, yval);
return y;
}
if(!y) {
addtag(l, r, x, xval);
return x;
}
int mid = l + r >> 1;
pushdown(l, r, x), pushdown(l, r, y);
int xls = tr[tr[x].l].val, yls = tr[tr[y].l].val, xrs = tr[tr[x].r].val, yrs = tr[tr[y].r].val;
tr[x].l = mrg(l, mid, tr[x].l, tr[y].l, (xval + yrs * (1 - val + mod) % mod) % mod, (yval + xrs * (1 - val + mod) % mod) % mod, val);
tr[x].r = mrg(mid + 1, r, tr[x].r, tr[y].r, (xval + yls * val % mod) % mod, (yval + xls * val % mod) % mod, val);
pushup(x);
return x;
}
void getval(int l, int r, int t) {
if(l == r) {
ans[l] = tr[t].val;
return ;
}
pushdown(l, r, t);
int mid = l + r >> 1;
getval(l, mid, tr[t].l), getval(mid + 1, r, tr[t].r);
}
} tree;
int n, cnt[maxn], son[maxn][2], a[maxn], tot, x[maxn];
void dfs(int u) {
if(!cnt[u])
rt[u] = tree.modify(1, tot, a[u], rt[u], 1);
if(cnt[u] == 1)
dfs(son[u][0]), rt[u] = rt[son[u][0]];
if(cnt[u] == 2) {
dfs(son[u][0]), dfs(son[u][1]);
rt[u] = tree.mrg(1, tot, rt[son[u][0]], rt[son[u][1]], 0, 0, a[u]);
}
}
int qpow(int x, int k, int p) {
int res = 1;
while(k) {
if(k & 1)
res = res * x % p;
k >>= 1, x = x * x % p;
}
return res;
}
signed main() {
cin >> n;
for (int x, i = 1; i <= n; i++)
cin >> x, son[x][cnt[x]++] = i;
int inv = qpow(10000, mod - 2, mod);
for (int i = 1; i <= n; i++) {
cin >> a[i];
a[i] %= mod;
if(cnt[i])
a[i] = a[i] * inv % mod;
else
x[++tot] = a[i];
}
sort(x + 1, x + tot + 1);
for (int i = 1; i <= n; i++) {
if(!cnt[i])
a[i] = lower_bound(x + 1, x + tot + 1, a[i]) - x;
}
dfs(1);
tree.getval(1, tot, rt[1]);
int res = 0;
for (int i = 1; i <= tot; i++)
res = (res + i * x[i] % mod * ans[i] % mod * ans[i] % mod) % mod;
cout << res << endl;
return 0;
}
/*
3
0 1 1
5000 1 1
*/