Description

  • \(n\in[1,500],k\in[2,10]\)。

Solution

  • 这是一道有点很有难度的题。

  • 先考虑判断一个数是否在数列\(a\)中。由于每次加的数是在\([0,k)\)的范围内,所以个位不定,但除个以外的位可以任意取值。
  • 考虑DP。记个位为第\(1\)位,设\(g_{i,p,x,a}\)表示我们构造的数第\(2\sim i\)位为0,第\(i\sim\infty\)位中最大的位值为\(p\),个位为\(a\),此时我们要将第\(i\)位刚好填到\(x\),个位变成了多少。
  • 初值的话,可以暴力算出\(i\in[1,2]\)时的\(g\)。
  • 不进位的转移显然。进位时,比如我们想算\(g_{i+1,p,1,a}\)的值,它可以由\(g_{i,k-1,1,a'}\)转移而来(\(a'\)表示我们在第\(i\)位填\(k-1\)次\(1\)后\(a\)会变成的数)。

  • 然后做树形DP。如果我们沿着子树节点序列转移,那么实际上就是沿着dfs序转移,可以转移到\(dfn[i]\)的范围是\([dfn[fa[i]],dfn[i])\)。
  • 设\(dp_{dfn[x],j,p,a}\)表示我们做到点\(x\),考虑到第\(j\)位(第\(j\)位放\(d[x]\)),前面的位的最大值为\(p\),个位为\(a\)的合法方案数。初值显然是\(dp_{1,j,d[1],g_{j,0,d[1],1}}=1\)。
  • 转移的话,一定是从\(dp_{i',j,p,x}\)转移到\(dp_{i,j-1,max(p,d),g_{j-1,p,d,x}}\),其中\(i'<i\)。这个可用前缀和优化。

  • 时空复杂度:\(O(nk^2(n+k))\)。

Code

#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);
}

【GMOJ6377】幽曲[埋骨于弘川]的更多相关文章

  1. 6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]

    题目描述 题解 随便bb 详细题解见 https://www.cnblogs.com/coldchair/p/11624979.html https://blog.csdn.net/alan_cty/ ...

  2. 9 Days 停课修炼题解集

    xj4604 排序 \(n,k <= 1e5\). 先考虑二分出这个值,check 有多少段的平均值小于这个 mid,这个在之前的复活赛中是原题 T4,数形结合,$ \text{Average} ...

  3. 西川善司【神秘海域(Uncharted)】的图形分析

          本文是为传播0月8日发售的[神秘海域 合集]魅力而短篇连载的第2回,这次主要集中在神秘海域系列的图形的技术方面.原文链接在 http://weekly.ascii.jp/elem/000/ ...

  4. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  5. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  6. 听歌识曲--用python实现一个音乐检索器

    听歌识曲,顾名思义,用设备"听"歌曲,然后它要告诉你这是首什么歌.而且十之八九它还得把这首歌给你播放出来.这样的功能在QQ音乐等应用上早就出现了.我们今天来自己动手做一个自己的听歌 ...

  7. 曲面之美:三星 S6 Edge+

    这些年安卓手机阵营一直拼得又激烈又惨烈,从拼配置,拼性能,拼性价比,到拼颜值拼情怀,拼得用户也都麻木了. 尤其是我这样的用户,不喜欢墨守成规,你配置高又如何,同样价钱的配置都差不多. 我想看不一样的东 ...

  8. 为川师大女生支招 15年如何还200W

    就在昨儿一条新闻火遍全网,川师大21岁女生樊师贝发帖称,希望有人借她200万,为父母在城里买房15年还清,至于利息“可以用后半生来陪伴你”.她说,六旬父亲要负担家用,哥哥啃老,而她目前一分钱都还没挣到 ...

  9. 网易云音乐PC端刷曲快捷键

    文章首发于szhshp的第三边境研究所(szhshp.org), 转载请注明 网易云音乐PC端刷曲快捷键   好吧我承认我特别懒 云音乐其实做的还不错,FM推荐的算法明显比虾米好. 虾米可以听的曲子都 ...

随机推荐

  1. winform项目中开发的一套UI控件库

    https://github.com/houyhea/winform-control-lib winform-control-lib 曾经在一个winform项目中开发的一套UI控件库 类图:  效果 ...

  2. Android安全测试(二)反编译检测

    1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip, dex2jar, jd-gui 2.操作步骤 第一步:把apk改后缀名为zip 第二步:将zip文件解压,得到 ...

  3. sql exist 和not exist(转载)

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select ...

  4. python-IDE的使用(小白先看)

    一.定义 IDE:集成开发环境(Integrated Development Environment) 二.常见的IDE工具: 1.VIM,经典的Linux下的文本编辑器 2.Emacs,LInux的 ...

  5. 转载-linux挂载的意思

    挂载:Liunx采用树形的文件管理系统,也就是在Linux系统中,可以说已经没有分区的概念了.分区在Linux和其他设备一样都只是一个文件.要使用一个分区必须把它加载到文件系统中.这可能难于理解,继续 ...

  6. windows10配置Docker容器独立IP地址互相通信

    Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...

  7. [Python3 填坑] 007 多才多艺的 len()

    目录 1. print( 坑的信息 ) 2. 开始填坑 (1) 总的来说 (2) 举例说明 (3) 后记 1. print( 坑的信息 ) 挖坑时间:2019/01/10 明细 坑的编码 内容 Py0 ...

  8. SSI框架【Struts、Spring、iBatis、Hibernate】

    1.B/S架构的JavaEE开发设计模式,JavaEE架构分成三个层次即表现层.业务逻辑层.数据持久层:而这三层分别通过Struts.Spring.iBatis开源的框架紧密组合在一起的. Strut ...

  9. HDFS数据流——写数据流程

    剖析HDFS文件写入 假设文件ss.avi共200m,其写入HDFS指定路径/user/atguigu/ss.avi流程如下: 1)客户端向namenode请求上传文件到指定路径,namenode通过 ...

  10. HDU 6468 /// DFS

    题目大意: 把 1~15 的数字典序排序后为 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9 此时给定 n k, 求1~n的数组字典序排序后 第k个 ...