11.14
比较神,考虑先确定最优策略,用邻项交换,发现要满足 \(s_i+w_i<s_j+w_j\) 那么 \(i\) 在 \(j\) 上方。接下来用这个顺序跑 \(01\) 背包就好了,在 \(s_i\sim 0\) 这个区间跑就好了。
分块,考虑暴力能 \(O(B)\) 跳块,\(O(\frac{n}{B})\) 修改,所以平衡一下就到 \(O(n\sqrt n)\) 的复杂度了。
ak 赛错误总结:
-
矩阵的边界处理
-
并查集的预处理
-
状压的编号从 \(0\) 开始
-
复制时注意及时修改 \(i,j\)
-
注意并查集初始化范围,否则答案问题极大
-
矩阵的 \(i,j\) 两位对应行列错误。
题意简述:对于一棵树动态加点,求当前以 \(1\) 为根的满二叉树个数,对 \(998244353\) 取模。
发现这是一个十分模板的树形 dp,与动态 dp 相类似,但更简单。
发现一棵满二叉树的高度最多为 \(\log_2n\),于是只需要考虑高度少于 \(\log_2n\) 的节点即可。
设 \(dp_{x,dep,1}\) 表示以 \(x\) 为根,最深节点到 \(1\) 距离为 \(dep\) 的满二叉树个数,同时为了方便转移,设 \(dp_{x,dep,0}\) 表示 \(x\) 只有一个儿子,而那个儿子是满二叉树的方案数。
转移时:
\(dp_{x,dep,1}=dp_{x,dep,1}+dp_{x,dep,0}\times dp_{y,dep,1}\);
\(dp_{x,dep,0}=dp_{x,dep,0}+dp_{y,dep,1}\)。
当一个节点深度过大,超过 \(\log_2n\) 时,就可以直接跳过。修改的时候只需要修改这个链。时间复杂度 \(O(n\log n)\) 。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,M=998244353;
using ll=long long;
int qp(int a,int x=M-2){
int res=1;for(;x;x>>=1,a=ll(a)*a%M)
if(x&1)res=ll(res)*a%M;return res;
}
void add(int &x,int y){
if((x+=y)>=M)x-=M;
}
int f[N],n,d[N],dp[N][22][2],ans;
int main(){
ios::sync_with_stdio(false);
cin>>n;int x,y,_d,nw,p,pr,dat;
for(x=1;x<=n;++x){
if(x>1)cin>>f[x];
d[x]=d[f[x]]+1,_d=d[x];
if(_d<=20){
dp[x][_d][1]=nw=1,pr=0;
for(y=f[x];y;y=f[y]){
dat=nw;
nw=(ll(dp[y][_d][0]+M-pr)*nw)%M;
add(dp[y][_d][0],dat);
pr=dp[y][_d][1],add(dp[y][_d][1],nw);
}
}
for(p=1,ans=0;p<=20;++p)
add(ans,dp[1][p][1]);
printf("%d\n",ans);
}return 0;
}
11.10 game - 题单 - 洛谷 | 计算机科学教育新生态
t3 十分巧妙,值得回味。
11.12 game - 题单 - 洛谷 | 计算机科学教育新生态
t3 值得看的结论:
\(\forall i \in [1,n],\ j \in [1,n]\ \gcd\{p_i - p_j\}\) 与 \(\forall i \in [1,n-1]\ \gcd\{p_{i+1} - p_i\}\) 相等
神似 NOIP 2024 T4。
暴力会建出来 \(n^2\) 条边,但是根据最小生成树的删边规则来看,如果有排序后 \(x\) 或 \(y\) 不相邻的边,替换成相邻的一定更优。所以排序后相邻的两边即可。
一些启示:

浙公网安备 33010602011771号