标签:names 节点 https esc 暴力 int 难度 space 优化
#include <cstdio>
#include <cstring>
#define max(x,y) ((x)>(y)?(x):(y))
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=505,K=11,mo=998244353;
int n,k,g[N][K][K][K],u,d[N],x,y,ti,dfn[N],dp[N][N][K][K],ans;
bool e[N][N];
void P(int&x,int y) {x=(x+y)%mo;}
void dfs(int u,int fa)
{
if(!ti++)
fo(j,1,n)
{
int x=g[j][0][d[u]][1];
dp[ti][j][d[u]][x]=1;
}
else
fo(j,2,n) fo(p,0,k-1) fo(x,0,k-1)
{
int p1=max(p,d[u]), x1=g[j-1][p][d[u]][x];
if(~x1) P(dp[ti][j-1][p1][x1],(mo+dp[ti-1][j][p][x]-dp[dfn[fa]-1][j][p][x])%mo);
P(dp[ti][j-1][p][x],dp[ti-1][j-1][p][x]);
}
fo(x,d[u],k-1) P(ans,(mo+dp[ti][1][x][d[u]]-dp[ti-1][1][x][d[u]])%mo);
dfn[u]=ti;
fo(v,1,n) if(v^fa&&e[u][v]) dfs(v,u);
}
int main()
{
freopen("buried.in","r",stdin);
freopen("buried.out","w",stdout);
scanf("%d%d",&n,&k);
memset(g,-1,sizeof g);
fo(p,0,k-1)
{
g[1][p][0][0]=0;
fo(x,0,k-1)
if(p|x)
{
int y=x;
while(y<k)
{
g[1][p][y][x]=y;
y+=max(p,y);
}
g[2][p][1][x]=y-k;
}
}
fo(i,2,n)
fo(p,0,k-1)
fo(a,0,k-1)
{
g[i][p][0][a]=a;
if(!~(u=g[i][p][1][a])) continue;
fo(x,2,k-1) if(!~(u=g[i][p][x][a]=g[i][max(p,x-1)][1][u])) break;
if(~u) g[i+1][p][1][a]=g[i][k-1][1][u];
}
fo(i,1,n) scanf("%d",&d[i]);
fo(i,1,n-1) scanf("%d%d",&x,&y),e[x][y]=e[y][x]=1;
dfs(1,0);
printf("%d",ans);
}
标签:names 节点 https esc 暴力 int 难度 space 优化
原文地址:https://www.cnblogs.com/Iking123/p/11626041.html