题目描述







题解

随便bb

详细题解见

https://www.cnblogs.com/coldchair/p/11624979.html

https://blog.csdn.net/alan_cty/article/details/84557477

https://www.cnblogs.com/Iking123/p/11626041.html

这里讲讲自己发现的东西和一些细节

f[i][p][a]表示第i位以后(包括第i位)的最大值,a表示个位,在第i为进1的个位会变成什么

为什么要包括第i位呢,因为假设的进位不会影响到p,所以考虑上包括的情况都一样

而且可以适应第i位不为0的情况,更严谨一些

g[i][p][x][a]的x表示第i位放x后个位会变成什么,只需要进x次位就行了

当i=1时要特殊考虑(考虑能否放x)

至于f和g的取值是否重复,显然不会不然怎么做

把方程列出来后可以发现结果其实是存在原来的状态上的,所以不会重复不然就是列错了

dp[i][j][p][a]表示dfs序为i,做到第j位的方案数

转移前缀和优化,可以直接把dp[i]设为原来的dp[1..i]

要考虑i=1和j=1

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define add(a,b) (a=(a+(b)%998244353)%998244353)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define mod 998244353
using namespace std; struct type{
int x,y;
} E[1001];
int a[1001][2];
int ls[501];
int f[501][10][10]; //f[i][p][a] p=max in [>=i] a=the first
int g[501][10][10][10]; //g[i][p][x][a]
int dp[501][501][10][10]; //dp[i][j][p][a]
int st[501];
int d[501];
int fa[501];
int N,A,n,K,I,i,j,k,l,len;
long long ans; bool cmp(type a,type b)
{
return a.x<b.x || a.x==b.x && a.y>b.y;
} void New(int x,int y)
{
++len;
a[len][0]=y;
a[len][1]=ls[x];
ls[x]=len;
} void dfs(int Fa,int t)
{
int i; fa[t]=Fa;
st[t]=++N; for (i=ls[t]; i; i=a[i][1])
if (a[i][0]!=Fa)
dfs(t,a[i][0]);
} void Dfs(int Fa,int t)
{
int i,j,k,l; i=st[t];
fo(j,1,n)
{
fo(k,0,K-1)
{
fo(l,0,K-1)
dp[i][j][k][l]=dp[i-1][j][k][l];
}
} fo(j,1,n)
{
fo(k,0,K-1)
{
fo(l,0,K-1)
{
if (j>1)
{
if (t>1)
add(dp[i][j-1][max(k,d[t])][g[j][k][d[t]][l]],dp[i-1][j][k][l]-dp[st[fa[t]]-1][j][k][l]);
else
add(dp[i][j-1][max(k,d[t])][g[j][k][d[t]][l]],dp[i-1][j][k][l]);
}
else
if (g[j][k][d[t]][l]>-1)
{
if (t>1)
add(ans,dp[i-1][j][k][l]-dp[st[fa[t]]-1][j][k][l]);
else
add(ans,dp[i-1][j][k][l]);
}
}
}
} for (i=ls[t]; i; i=a[i][1])
if (a[i][0]!=Fa)
Dfs(t,a[i][0]);
} int main()
{
freopen("buried.in","r",stdin);
freopen("buried.out","w",stdout); scanf("%d%d",&n,&K);
fo(i,1,n)
scanf("%d",&d[i]);
fo(i,2,n)
{
scanf("%d%d",&j,&k); E[++l]={j,k};
E[++l]={k,j};
} sort(E+1,E+l+1,cmp); fo(i,1,l)
New(E[i].x,E[i].y); memset(f,255,sizeof(f));
memset(g,255,sizeof(g)); fo(i,0,K-1)
{
fo(j,0,K-1)
if (i|j)
{
k=j;
while (k<K)
k+=max(i,k); f[2][i][j]=k%K;
}
}
fo(i,2,n-1)
{
fo(j,0,K-1)
{
fo(k,0,K-1)
if (j|k)
{
l=k; fo(I,0,K-1)
if (f[i][max(j,I)][l]>-1)
l=f[i][max(j,I)][l];
else
break; if (I==K)
f[i+1][j][k]=l;
}
}
} fo(j,0,K-1)
{
fo(l,0,K-1)
if (j|l)
{
A=l;
while (A<K)
{
g[1][j][A][l]=A;
A+=max(j,A);
}
}
}
fo(i,2,n)
{
fo(j,0,K-1)
{
fo(l,0,K-1)
if (j|l)
{
A=l; fo(k,0,K-1)
if (A>-1)
{
g[i][j][k][l]=A;
A=f[i][max(j,k)][A];
}
else
break;
}
}
} fo(i,1,n)
dp[0][i][0][1]=1; N=0;
dfs(0,1);
Dfs(0,1); printf("%lld\n",(ans+mod)%mod); fclose(stdin);
fclose(stdout); return 0;
}

6377. 【NOIP2019模拟2019.10.05】幽曲[埋骨于弘川]的更多相关文章

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

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

  2. 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)

    Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ...

  3. 6383. 【NOIP2019模拟2019.10.07】果实摘取

    题目 题目大意 给你一个由整点组成的矩形,坐标绝对值范围小于等于\(n\),你在\((0,0)\),一开始面向\((1,0)\),每次转到后面第\(k\)个你能看到的点,然后将这条线上的点全部标记删除 ...

  4. 6392. 【NOIP2019模拟2019.10.26】僵尸

    题目描述 题解 吼题但题解怎么这么迷 考虑一种和题解不同的做法(理解) 先把僵尸离散化,h相同的钦(ying)点一个大小 (可以发现这样每种情况只会被算正好一次) 计算完全被占领的方案,然后1-方案/ ...

  5. 6389. 【NOIP2019模拟2019.10.26】小w学图论

    题目描述 题解 之前做过一次 假设图建好了,设g[i]表示i->j(i<j)的个数 那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同 从n~1染色,点i的方案 ...

  6. 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)

    题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ...

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

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

  8. 6424. 【NOIP2019模拟2019.11.13】我的订书机之恋

    题目描述 Description Input Output Sample Input 见下载 Sample Output 见下载 Data Constraint 题解 lj题卡线段树 求出每个右端点往 ...

  9. 【NOIP2019模拟2019.9.4】B(期望的线性性)

    题目描述: \(1<=n,ai<=5*10^5\) 题解: 我是弱智我不会期望线性. 设\(E(a[i])\)表示第i个期望被减的个数. \(E(a[1])=a[1]\) 不难发现\(E( ...

随机推荐

  1. SAP屏幕事件的控制

    1. INITALIZATION事件 该事件在屏幕未显示之前执行,对程序设置值及屏幕元素进行初始化赋值. REPORT  Y001. PARAMETERS QUAL_DAY TYPE D DEFAUL ...

  2. 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 nvarchar

    .TrimEnd() 怀疑是否SqlBulkCopy是否存在某种bug,故而在系统中改写代码,用单个sql的插入数据方式,用循环逐条导入.结果是没问题.难道真的是SqlBulkCopy有某种bug?上 ...

  3. Android专项测试监控资源

    版本号 V 1.1.0 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试(本次主要关注点为app的性能测试) Android的app性能测试包括的测 ...

  4. Java——HashMap源码解析

    以下针对JDK 1.8版本中的HashMap进行分析. 概述     哈希表基于Map接口的实现.此实现提供了所有可选的映射操作,并且允许键为null,值也为null.HashMap 除了不支持同步操 ...

  5. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  6. docker--搭建docker swarm集群

    10 搭建docker swarm集群 10.1 swarm 介绍 Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行 为.比如我们常见的蜂群,鱼群,秋天 ...

  7. java8 stream取出 最大值/最小值

    注:转载请注明出处!!! 这里直接用取出多个对象中某个值 最大/最小 来进行举例 直接看代码 /** * 时间测试类 */ class TimeTest { private Date time; pu ...

  8. Django 调试models 输出的SQL语句 定位查看结果

    django 调试models变得更为简单了,不用像之前的版本, 手工去调用django query, 才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings.py里,配置如下 ...

  9. vscode学习(三)之如何修改打开终端的默认shell

    实现 第一步:打开VSCode的设置(Preferences>User Settings) 第二步:搜索terminal.integrated.shell.osx 的 并把它的值改为你的zsh安 ...

  10. 05-Django-session-admin

    # session- 为了应对HTTP协议的无状态性- 用来保存用户比较敏感的信息- 属于request的一个属性- 常用操作: - request.session.get(key, defaultV ...