题意

给一个长度为 \(n\) 的整数序列 \(a\),其中 \(a_i\) 要么为 \(-1\),要么为 \(1\sim k\) 中的整数。

求出将所有 \(-1\) 替换为 \(1\sim k\) 中整数的方案数,满足替换后的序列中不存在连续 \(l\) 个相同的数,对 \(998244353\) 取模。

\(\texttt{Data Range:}1\leq l\leq n\leq 10^5,1\leq k\leq 100\)

题解

注意到 \(k\) 的范围很小,可以设一个 \(f_{i,j}\) 表示第 \(i\) 个位置的数字为 \(j\) 的时候前缀的方案数,再记一个 \(s_i=\sum f_{i,j}\)。

首先注意到只有 \(a_i=-1\) 或者 \(a_i=j\) 的时候 \(f_{i,j}\) 才可能被转移到。

于是考虑设 \(len_{i,j}\) 表示以 \(i\) 为后缀最多连续的 \(j\) 的个数。

当 \(len_{i,j}<l\) 的时候 \(f_{i,j}=s_{i-1}\)。

否则因为可以在这段后缀中填出大于等于 \(l\) 的,要减掉不合法的方案数,为 \(s_{i-l}-f_{i-l,j}\)。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef int ll;
  4. typedef long long int li;
  5. const ll MAXN=2e5+51,MOD=998244353;
  6. ll n,kk,l,p;
  7. ll x[MAXN],f[MAXN][101],len[MAXN][101],s[MAXN];
  8. inline ll read()
  9. {
  10. register ll num=0,neg=1;
  11. register char ch=getchar();
  12. while(!isdigit(ch)&&ch!='-')
  13. {
  14. ch=getchar();
  15. }
  16. if(ch=='-')
  17. {
  18. neg=-1;
  19. ch=getchar();
  20. }
  21. while(isdigit(ch))
  22. {
  23. num=(num<<3)+(num<<1)+(ch-'0');
  24. ch=getchar();
  25. }
  26. return num*neg;
  27. }
  28. int main()
  29. {
  30. n=read(),kk=read(),l=read(),s[0]=1;
  31. if(l==1)
  32. {
  33. return puts("0"),0;
  34. }
  35. for(register int i=1;i<=n;i++)
  36. {
  37. x[i]=read();
  38. for(register int j=1;j<=kk;j++)
  39. {
  40. len[i][j]=len[i-1][j]+(x[i]==-1||x[i]==j);
  41. }
  42. }
  43. if(x[1]==-1)
  44. {
  45. for(register int i=1;i<=kk;i++)
  46. {
  47. f[1][i]=1;
  48. }
  49. s[1]=kk;
  50. }
  51. else
  52. {
  53. f[1][x[1]]=1,s[1]=1;
  54. }
  55. for(register int i=2;i<=n;i++)
  56. {
  57. for(register int j=1;j<=kk;j++)
  58. {
  59. if(x[i]==-1||x[i]==j)
  60. {
  61. f[i][j]=s[i-1];
  62. if(i>=l)
  63. {
  64. p=i-l;
  65. if(len[i][j]-len[p][j]==l)
  66. {
  67. f[i][j]=((li)f[i][j]+f[p][j]-s[p]+MOD)%MOD;
  68. }
  69. }
  70. }
  71. s[i]=(s[i]+f[i][j])%MOD;
  72. }
  73. }
  74. printf("%d\n",s[n]);
  75. }

CodeForces 1093F Vasya and Array的更多相关文章

  1. Educational Codeforces Round 56 (Rated for Div. 2) F - Vasya and Array dp好题

    F - Vasya and Array dp[ i ][ j ] 表示用了前 i 个数字并且最后一个数字是 j 的方案数. dp[ i ][ j ] = sumdp [i - 1 ][ j ], 这样 ...

  2. Codeforces 442C Artem and Array(stack+贪婪)

    题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...

  3. Codeforces Round #504 D. Array Restoration

    Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...

  4. CodeForces - 837E - Vasya's Function | Educational Codeforces Round 26

    /* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f( ...

  5. CodeForces - 1093F:Vasya and Array (DP&计数)

    题意:N,K,L,以及给定长度为N的序列,表示其对应的颜色,-1表示还没有涂色,现在让你去涂色,使得最后没有大于等于L的连续的同色的情况. 思路:我们用dp[i][j]表示第i个位置颜色为j的合法方案 ...

  6. Educational Codeforces Round 56 (Rated for Div. 2) F. Vasya and Array

    题意:长度为n的数组,数组中的每个元素的取值在1-k的范围内或者是-1,-1代表这个元素要自己选择一个1-k的数字去填写,然后要求填完的数组中不能出现连续长度大于len的情况,询问填空的方案数. 题解 ...

  7. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  8. Codeforces 754A Lesha and array splitting(简单贪心)

    A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...

  9. Codeforces 837E. Vasya's Function

    http://codeforces.com/problemset/problem/837/E   题意: f(a, 0) = 0; f(a, b) = 1 + f(a, b - gcd(a, b)) ...

随机推荐

  1. pycharm安装注意

    在安装pycharm时,一定要先去官网下载安装python新版. 安装python时候一定要选择自己熟悉的路径 在pycharm创建项目时编译器选择versions/3.8/bin/python3,这 ...

  2. Python-设置文件缓冲类型

    案例: 将文件内容写入到硬件设备时候,使用系统调用,这类IO操作时间长,为了减小IO操作,通常会使用缓冲区(有足够多数据才能调用). 文件缓冲行为分为:全缓冲,行缓冲,无缓冲 如何解决? open(' ...

  3. 《kubernetes + .net core 》dev ops部分

    目录 1.kubernetes 预备知识 1.1 集群资源 1.1.1 role 1.1.2 namespace 1.1.3 node 1.1.4 persistent volume 1.1.5 st ...

  4. python基础知识 变量 数据类型 if判断

    cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...

  5. SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录

    SFUD+FAL+EasyFlash典型场景需求分析:用整个flash存储数据,上千条数据,读取得时候用easyflash很慢,估计要检索整个flash太慢了. 改进方法:分区检索. 1存数据时,根据 ...

  6. Typore的简单用法

    1 无序列表使用方法 +号和空格一起按就可以写出这个点 2 有序列表使用方法 .先写1.然后打个空格就再回车 3 使用#和空格表示一级标题 一级标题 4 使用##和空格表示二级标题 5 二级标题 6 ...

  7. Intel HEX格式

    来来 !! come baby  !  只强调一点这篇文章有checksum的算法,是我最喜欢地!! 参考:https://blog.csdn.net/extlife/article/details/ ...

  8. 【学习笔记】Dirichlet前缀和

    题目戳我 \(\text{Solution:}\) 观察到一个\(a_i\)若对\(a_j\)有贡献,则必须\(i\)的所有质因子幂次小于等于\(j\)的质因子幂次. 于是,我们可以枚举质数的倍数并累 ...

  9. 这次一定让你记住 TCP 三次握手、四手挥手!

    TCP协议全称为:Transmission Control Protocol,是一种面向链接.保证数据传输安全.可靠的数据传输协议.为了确保数据的可靠传输,不仅需要对发出的每个字节进行编号确认,还需要 ...

  10. kafka配置文件详解

    kafka的配置分为 broker.producter.consumer三个不同的配置 一 .BROKER 的全局配置最为核心的三个配置 broker.id.log.dir.zookeeper.con ...