题解

真的都快忘了。
首先,我们考虑排序,求出一个神奇的排列方式,也就是dfn序。
那么答案必定是在dfn序里面一些连续的段连接起来。
然后我们就判断这玩意儿是否满足在a里面出现过。

于是现在分两步走:

第一步,假如现在有一个数字A,我们要判断其是否可以出现在a里面。
我们现在就有一种构造思路就是:从高位开始构造,假设现在构造到第i位,一直加个位之后,满足当前这位等于数字A的第i位后,继续构造第i-1位。
那么我们发现可以用一个神奇的DP来实现这个判断过程。

设fi,p,xf_{i,p,x}fi,p,x​表示当前做到第i位,最高位到第i位数字已经填完后最大的数字为p,个位为x开始,让第i位+1后个位变成fi,p,xf_{i,p,x}fi,p,x​。
这个就可以从低位开始转移到高位,每次让低位进位k次即可。注意这个p,不然会被搞崩心态。
然后再设一个gi,j,p,xg_{i,j,p,x}gi,j,p,x​表示的东东和上面类似,只是这个j表示的是让第i位进位到j。
转移的话就从j-1位进过去,利用f数值即可。

第二步,开始统计答案。
我们设dpi,j,p,xdp_{i,j,p,x}dpi,j,p,x​表示当前走到dfn序中的第i位,当前弄出来的数字是第j位,且当前位置放的是d[dfn[i]]d[dfn[i]]d[dfn[i]],最大值为p,各位从x开始的方案数。
我们发现,这个i是可以从faifa_ifai​到iii这一段区间内转移过来的。
所以说,我们可以利用前缀和优化一下,时间复杂度就变成O(n2∗k2)O(n^2*k^2)O(n2∗k2)

小细节巨多无比。

标程

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
const long long mo=998244353;
const int maxn=501;
const int maxm=11;int n,m,a[maxn],x[maxn],y[maxn],gs;
int f[maxn][maxm][maxm];
int g[maxn][maxm][maxm][maxm];
long long dp[maxn][maxn][maxm][maxm],sum[maxn][maxn][maxm][maxm];
int tot,nex[maxn*2],las[maxn*2],tov[maxn*2];
int dfn[maxn],wz[maxn],fa[maxn],dep;
int tot1,nex1[maxn*2],las1[maxn*2],tov1[maxn*2];
int son[maxn][maxn];__attribute__((optimize("-O3")))
void qsort(int x,int l,int r)
{int i=l;int j=r;int m=son[x][(i+j)/2];while (i<=j){while (son[x][i]>m) i++;while (son[x][j]<m) j--;if (i<=j){swap(son[x][i],son[x][j]);i++;j--;}}if (l<j) qsort(x,l,j);if (r>i) qsort(x,i,r);
}__attribute__((optimize("-O3")))
void insert(int x,int y)
{tot++;tov[tot]=y;nex[tot]=las[x];las[x]=tot;
}__attribute__((optimize("-O3")))
void insert1(int x,int y)
{tot1++;tov1[tot1]=y;nex1[tot1]=las1[x];las1[x]=tot1;
}__attribute__((optimize("-O3")))
void dfs(int x,int ff)
{gs++;dfn[x]=gs;wz[gs]=x;for (int i=las1[x];i>0;i=nex1[i]){if (tov1[i]!=ff){fa[tov1[i]]=x;dfs(tov1[i],x);}}
}__attribute__((optimize("-O3")))
void dfssort(int x,int ff)
{for (int i=las[x];i>0;i=nex[i]){if (tov[i]!=ff){son[x][0]++;son[x][son[x][0]]=tov[i];dfssort(tov[i],x);}}qsort(x,1,son[x][0]);for (int i=1;i<=son[x][0];i++){insert1(x,son[x][i]);insert1(son[x][i],x);}
}__attribute__((optimize("-O3")))
int main()
{//  freopen("data.in","r",stdin);freopen("buried.in","r",stdin);freopen("buried.out","w",stdout);scanf("%d%d",&n,&m);for (register int i=1;i<=n;i++){scanf("%d",&a[i]);}for (register int i=1;i<n;i++){scanf("%d%d",&x[i],&y[i]);insert(x[i],y[i]);insert(y[i],x[i]);}dfssort(1,0);dfs(1,0);for (register int i=1;i<=n;i++){for (register int p=0;p<m;p++){for (register int x=0;x<m;x++){f[i][p][x]=-1;for (register int a=0;a<m;a++){g[i][p][a][x]=-1;}}}}for (register int i=0;i<m;i++){for (register int x=0;x<m;x++){if (i>0 || (i==0 && x>0)){register int j=x;while (j<m){g[1][i][j][x]=j;j=j+max(j,i);}f[1][i][x]=j%m;g[2][i][1][x]=j%m;}}}for (register int i=0;i<m;i++){for (register int x=0;x<m;x++){g[2][i][0][x]=x;if (i>0 || (i==0 && x>0)){register int j=f[1][i][x];for (register int cs=2;cs<m;cs++){g[2][i][cs][x]=f[1][max(i,cs-1)][j];j=f[1][max(i,cs-1)][j];}}}}for (register int i=2;i<=n;i++){for (register int p=0;p<m;p++){for (register int x=0;x<m;x++){if (p>0 || (p==0 && x>0)){register int op=x;g[i][p][0][x]=x;for (register int j=0;j<m;j++){op=f[i-1][max(p,j)][op];if (j<m-1) g[i][p][j+1][x]=op;}f[i][p][x]=op;}}}}for (register int i=3;i<=n;i++){for (register int p=0;p<m;p++){for (register int x=0;x<m;x++){if (p>0 || (p==0 && x>0)){register int op=f[i-2][m-1][g[i-1][p][m-1][x]];g[i][p][1][x]=op;}}}}for (register int i=3;i<=n;i++){for (register int p=0;p<m;p++){for (register int x=0;x<m;x++){g[i][p][0][x]=x;if (p>0 || (p==0 && x>0)){register int j=g[i][p][1][x];for (register int cs=2;cs<m;cs++){g[i][p][cs][x]=f[i-1][max(p,cs-1)][j];j=f[i-1][max(p,cs-1)][j];}}}}}for (register int i=1;i<=n;i++){dp[1][i][a[1]][g[i][0][a[1]][1]]=1;sum[1][i][a[1]][g[i][0][a[1]][1]]=1;}for (register int i=2;i<=n;i++){for (register int p=0;p<m;p++){for (register int x=0;x<m;x++){for (register int w=1;w<=n-i+1;w++){if (g[w][p][a[wz[i]]][x]>=0){dp[i][w][max(p,a[wz[i]])][g[w][p][a[wz[i]]][x]]=(dp[i][w][max(p,a[wz[i]])][g[w][p][a[wz[i]]][x]]+sum[i-1][w+1][p][x]-sum[dfn[fa[wz[i]]]-1][w+1][p][x]+mo)%mo;}}}} memcpy(sum[i],sum[i-1],sizeof(sum[i-1]));for (register int w=1;w<=n-i+1;w++){for (register int x=0;x<m;x++){for (register int p=0;p<m;p++){// if (g[w][p][a[wz[i]]][x]>=0){sum[i][w][p][x]=(sum[i][w][p][x]+dp[i][w][p][x])%mo;}}}} }long long ans=0;for (register int i=1;i<=n;i++){for (register int j=a[wz[i]];j<m;j++){ans=(ans+dp[i][1][j][a[wz[i]]])%mo;}}printf("%lld\n",ans);
}

jzoj6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]相关推荐

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

    题目 题目大意 有个无限长的数列an{a_n}an​,a1=1a_1=1a1​=1,an=an−1+maxdightk(an−1)a_n=a_{n-1}+maxdight_k(a_{n-1})an​= ...

  2. 【GMOJ6377】幽曲[埋骨于弘川]

    Description \(n\in[1,500],k\in[2,10]\). Solution 这是一道有点很有难度的题. 先考虑判断一个数是否在数列\(a\)中.由于每次加的数是在\([0,k)\ ...

  3. JZOJ6384【NOIP2019模拟2019.10.23】珂学家

    珂学家 题目描述: 输入: 输出: 输出共mmm行,每行一个非负整数表示答案. 这道题看到是一个区间,便想到了数据结构之类的东西. 但是呢它好像不带修.所以初步判断这是个离线的题目. 再仔细观察发现, ...

  4. 6374. 【NOIP2019模拟2019.10.04】结界[生与死的境界]

    题目 题目大意 给你一个数列,每次可以选择任意两个相邻的数xxx和yyy,将其删去,并在原来位置插入x+2yx+2yx+2y. 每次询问一个区间,对这个区间进行上述操作.求最后剩下的数最大是多少. 答 ...

  5. jzoj6384. 【NOIP2019模拟2019.10.23】珂学家

    Description Input Output 输出共 行,每行一个非负整数表示答案. Sample Input 2 1 1 2 3 2 1 3 5 Sample Output 4 只能选用试剂1 ...

  6. 6360. 【NOIP2019模拟2019.9.18】最大菱形和(rhombus)

    Description Input Output Sample Input 5 5 2 0 1 5 7 3 -4 2 0 -9 8 3 9 0 7 8 2 -4 5 -7 1 4 5 8 7 0 6 ...

  7. JZOJ6362. 【NOIP2019模拟2019.9.18】数星星(star)

    Description Solution 考虑分治,将每一个询问挂在包括它的最大的区间中. 只考虑中点往右的区间的贡献,那么每一个点对于覆盖它的最早的时间有一个贡献. 我们建一个虚树,并且用并查集路径 ...

  8. 《惢客创业日记》2019.10.05(周六)九月份的工作总结

    由于国庆放假,又加上上个月分享健康话题,九月份的工作总结就推延到了今天.九月份的工作仍然不是很理想,至少和月初制定的工作计划大相径庭.我仿佛像一个救火队员,做的全都是紧急的事情,根本谈不上有条不紊.也 ...

  9. 2019/11/05 校内模拟

    CSP-S 模拟 T1 盘王节 这是一道模拟题,那些细节问题一定要想清楚再写. 那么有两种策略: 先把御符打完,再用剩下的兵符随便打. 一张御符都不打,直接用自己大的兵符打对方小的兵符,得到最大伤害. ...

最新文章

  1. 明明表中有这个索引,但mysql的force index 无效?
  2. 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?
  3. 如何安装部署salt yum?
  4. 找规律 百度之星资格赛 1001 大搬家
  5. WEB前端 实现图片懒加载 echo.js
  6. 完全内核移植–kernel3.15.3
  7. Mysql语句与应用
  8. 江苏省2021年高考成绩查询有分数吗,2021年江苏省高考成绩查询入口
  9. nupkg格式_nupkg文件怎么打开(package程序安装)
  10. 2019年共享充电宝行业发展情况分析报告
  11. Sublime Text2使用教程
  12. Python Opencv 简单视频裁剪功能的实现
  13. 实战攻防演之阻击CSRF威胁
  14. 故事分享|B站up主的感悟:粉丝从0到1.4万,我做对了什么?
  15. 解决已安装模块无法import的问题
  16. 比越南妹划算 1元团购美女
  17. 给文字做涂鸦效果的五种实现方案
  18. 第15节 单臂路由上部署DHCP服务器及DHCP中继——基于PacketTracer仿真实验
  19. ThinkPHP 6.0 phpspreadsheet操作Excel表格实例
  20. NOJ-1577-0-1背包问题

热门文章

  1. k8s 集群一键部署(持续更新)
  2. 打开和关闭HDMI输出方法
  3. Eucalyptus使用的技术
  4. Gradle下载超时
  5. 三级等保备案去哪查_民贷天下通过国家信息安全等级保护三级备案
  6. 雷达信号处理基础 距离方程
  7. 飞智黑武士X9 ET PRO完美改装震动及背光
  8. 爬取去哪儿网机票数据
  9. 图像特征提取之Haar特征_人脸识别
  10. 一致连续(uniform continuous)