[DP] 跳水运动员
简要题意:
给出一棵树,要求割掉
对于
个人错误做法
转化问题,对于每一个
考虑构成连通块的条件:
对于区间
这启发我们考虑构造重构树,则有结论:合法区间
我们考虑
如果我们可以优化转移到O(1),复杂度就是
转化条件:小根树上,区间
我们对于每一个
先写一棵主席树,然后二分端点,查询区间的子树和是否为区间个数。然后就可以把
利用树状数组优化这个二维偏序,利用滚动数组优化空间,复杂度为
正解
同样考虑序列上从前往后 dp。
观察到一个联通块的另外一个条件,我们记录父亲信息,有且仅有一个点的父亲不在
所以我们分类讨论,考虑决策点
,区间 没有连向前面的边。 ,区间 有一条连向前面的边。
考虑定义两个
如果
直接做复杂度
观察到每次删除和加入都是一段后缀,把
总复杂度
code
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N=2e5+5,Md=998244353;
vector<int> vt[N];
int n,K,fa[N];
void dfs(int u,int Fa){
fa[u]=Fa;
for(int v:vt[u])
if(v!=Fa) dfs(v,u);
}
LL f[2][N],ans[N];
int st0[N],tp0,st1[N],tp1;
int l1[N],l2[N],lp1[N],lp2[N],lp3[N];
set<int> s1;
LL ss0[N],ss1[N];
int main(){
scanf("%d%d",&n,&K);
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
vt[u].push_back(v); vt[v].push_back(u);
}
dfs(1,0);
for(int i=1;i<=n;i++){
if(fa[i]>i) s1.insert(i);
for(int v:vt[i])
if(v!=fa[i] && v<i) s1.erase(v);
if(s1.size()>=1) l1[i]=*--s1.end();
if(s1.size()>=2) {
auto p=--s1.end(); --p;
l2[i]=*p;
}
}
tp0=tp1=0;
for(int i=1;i<=n;i++){
st0[++tp0]=i-1;
if(fa[i]<=i){
while(tp1 && st1[tp1]>=fa[i]) tp1--;
int x=tp0;
while(x && st0[x]>=fa[i]) x--;
for(int j=x+1;j<=tp0;j++) st1[++tp1]=st0[j];
tp0=x;
}
lp1[i]=lower_bound(st0+1,st0+tp0+1,l2[i])-st0-1;
lp2[i]=lower_bound(st0+1,st0+tp0+1,l1[i])-st0-1;
lp3[i]=lower_bound(st1+1,st1+tp1+1,l1[i])-st1-1;
}
int nw=0; f[0][0]=1;
for(int k=1;k<=K;k++){
nw^=1; for(int i=0;i<=n;i++) f[nw][i]=0;
tp0=tp1=0;
for(int i=1;i<=n;i++){
st0[++tp0]=i-1; ss0[tp0]=(ss0[tp0-1]+f[nw^1][i-1])%Md;
if(fa[i]<=i){
while(tp1 && st1[tp1]>=fa[i]) tp1--;
int x=tp0;
while(x && st0[x]>=fa[i]) x--;
for(int j=x+1;j<=tp0;j++) st1[++tp1]=st0[j],ss1[tp1]=(ss1[tp1-1]+f[nw^1][st0[j]])%Md;
tp0=x;
}
f[nw][i]=(ss0[lp2[i]]-ss0[lp1[i]]+ss1[tp1]-ss1[lp3[i]]+2*Md)%Md;
}
ans[k-1]=f[nw][n];
}
for(int i=0;i<K;i++) printf("%lld\n",ans[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】