10pts求助
查看原帖
10pts求助
671774
LUlululu1616楼主2024/8/4 15:06

死活调不出来,求大佬帮助,取模应该没问题吧

#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
*/
2024/8/4 15:06
加载中...