5.5 最大前缀和 & 时间流逝 & 树上异或
注意:暴力是
马上就想到了假设当前选数状态是一个前缀的方案数,应该是
考虑计算
需要注意的是
形式化题意
给定一长为
-
如果栈不为空,则有
的概率弹出一个元素。 -
如果没弹,在所有
栈顶的 里随机地取一个,将其入栈(不把 删掉,下一次也可能继续入栈)。
问操作终止时进行操作次数的期望。
Sol
首先考虑状态树。是一个单调递减的状态,并且和很小。这个状态数考试的时候要去搜一下,如果可以接受就直接搞。结论:在
假设根节点为
注意这里的概率都是
【树上高斯消元】:其实就是将这个式子后效性去除。
设
注意到这是一个线性关系,我们根本就不需要知道
此题更特殊,因为根节点
P9745 一道非常好的树上 dp
树上问题可以先考虑链的情况。
链的话就是一个
这个题的状态定义非常的妙,记住!!!
首先注意到:
注意题目是【联通块删边】。因此普通的状态不行。设
这个状态的优势在于:你每次算一条边,如果不删,那么可以直接和
因此还需要记录一个真正的
并且我们当前已经知道
故
后面的转移是不删边,由于计算的不包含
然后考虑优化,应该可以看出来要拆位。
然后你发现后面的转移就是把
但是为什么拆位算出来是对的。考虑
反正记住异或可以拆位就行了,合并应该都适用。
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int N = 5e5 + 5, M = 63, Mod = 998244353; ll read();
int n, m; vector <int> G[N];
ll a[N];
int dp[N], f[N][M][2];
void dfs(int x, int fa) {
// init x only 具体来说,是和 x 结合乘了多少
for(int i = 0;i <= 61; ++i)
if(a[x] & (1ll << i)) f[x][i][1] = 1;
else f[x][i][0] = 1;
for(int to : G[x]) {
if(to == fa) continue ;
dfs(to, x);
for(int j = 0;j <= 61; ++j) {
int xx = f[x][j][1], y = f[x][j][0];
f[x][j][1] = (1ll * xx * dp[to] % Mod + 1ll * y * f[to][j][1] % Mod + 1ll * xx * f[to][j][0] % Mod) % Mod;
f[x][j][0] = (1ll * y * dp[to] % Mod + 1ll * xx * f[to][j][1] % Mod + 1ll * y * f[to][j][0] % Mod) % Mod;
}
}
for(int j = 0;j <= 61; ++j) dp[x] = (dp[x] + (1ll << j) % Mod * 1ll * f[x][j][1] % Mod) % Mod;
}
// dp(x) = \sum f(x, y) * y 其它子树内连通块异或和的乘积。
// 具体地,你的拆位只是当一个状态变化
signed main() {
cin >> n;
for(int i = 1;i <= n; ++i) a[i] = read();
for(int i = 2, x;i <= n; ++i) {
x = read();
G[x].pb(i), G[i].pb(x);
} dfs(1, 0);
cout << dp[1];
return 0;
}
ll read() {
char c; ll f = 1, sum = 0;
while(c < '0' or c > '9') {if(c == '-') f = -1;c = getchar();}
while(c >= '0' and c <= '9') {sum = (sum << 3) + (sum << 1) + (c ^ 48);c = getchar();}
return sum * f;
}
// f(i, j, 0) = f(i,j,0)*g(to) + f(i,j,0)*f()
// 每一位的单独情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端