CodeForces 1093F Vasya and Array
题意
给一个长度为 \(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}\)。
代码
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e5+51,MOD=998244353;
ll n,kk,l,p;
ll x[MAXN],f[MAXN][101],len[MAXN][101],s[MAXN];
inline ll read()
{
    register ll num=0,neg=1;
    register char ch=getchar();
    while(!isdigit(ch)&&ch!='-')
    {
        ch=getchar();
    }
    if(ch=='-')
    {
        neg=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        num=(num<<3)+(num<<1)+(ch-'0');
        ch=getchar();
    }
    return num*neg;
}
int main()
{
    n=read(),kk=read(),l=read(),s[0]=1;
    if(l==1)
    {
        return puts("0"),0;
    }
    for(register int i=1;i<=n;i++)
    {
        x[i]=read();
        for(register int j=1;j<=kk;j++)
        {
            len[i][j]=len[i-1][j]+(x[i]==-1||x[i]==j);
        }
    }
    if(x[1]==-1)
    {
        for(register int i=1;i<=kk;i++)
        {
            f[1][i]=1;
        }
        s[1]=kk;
    }
    else
    {
        f[1][x[1]]=1,s[1]=1;
    }
    for(register int i=2;i<=n;i++)
    {
        for(register int j=1;j<=kk;j++)
        {
            if(x[i]==-1||x[i]==j)
            {
                f[i][j]=s[i-1];
                if(i>=l)
                {
                    p=i-l;
                    if(len[i][j]-len[p][j]==l)
                    {
                        f[i][j]=((li)f[i][j]+f[p][j]-s[p]+MOD)%MOD;
                    }
                }
            }
            s[i]=(s[i]+f[i][j])%MOD;
        }
    }
    printf("%d\n",s[n]);
}
												
											CodeForces 1093F Vasya and Array的更多相关文章
- 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 ], 这样 ...
 - Codeforces 442C Artem and Array(stack+贪婪)
		
题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...
 - Codeforces Round #504 D. Array Restoration
		
Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...
 - CodeForces - 837E - Vasya's Function   |  Educational Codeforces Round 26
		
/* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f( ...
 - CodeForces - 1093F:Vasya and Array (DP&计数)
		
题意:N,K,L,以及给定长度为N的序列,表示其对应的颜色,-1表示还没有涂色,现在让你去涂色,使得最后没有大于等于L的连续的同色的情况. 思路:我们用dp[i][j]表示第i个位置颜色为j的合法方案 ...
 - Educational Codeforces Round 56 (Rated for Div. 2)  F. Vasya and Array
		
题意:长度为n的数组,数组中的每个元素的取值在1-k的范围内或者是-1,-1代表这个元素要自己选择一个1-k的数字去填写,然后要求填完的数组中不能出现连续长度大于len的情况,询问填空的方案数. 题解 ...
 - 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 ...
 - Codeforces 754A Lesha and array splitting(简单贪心)
		
A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...
 - 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)) ...
 
随机推荐
- 超详细的 Vagrant 上手指南
			
搭建 Linux 虚拟机,别再用 VirtualBox 从 .iso 文件安装了. 概述 2020 年了,也许你已经习惯了 docker,习惯了在 XX 云上快速创建云主机,但是如果你想在个人电脑上安 ...
 - Servlet3.x部署描述符
			
简介 web.xml即部署描述符,位于WEB-INF目录下.在Servlet3以上版本有提供了注解的方式部署Servlet,因此web.xml是可选的.web.xml大概框架如下: <?xml ...
 - 烦人的Null,你可以走开点了
			
1. Null 的问题 假设现在有一个需要三个参数的方法.其中第一个参数是必须的,后两个参数是可有可无的. 第一种情况,在我们调用这个方法的时候,我们只能传入两个参数,对第三个参数,我们在上下文里是没 ...
 - CentOS 7安装docker和常用指令
			
1.安装 yum -y install docker 2.启动 systemctl start docker // 启动 docker -v //查看版本号 systemctl stop docker ...
 - JavaScript DOM三种创建元素的方式
			
三种创建元素的方式: document.write() element.innerHTML document.createElement() 初始HTML内容: <button>btn&l ...
 - shell-变量的数值运算-bc-typeset-中括号等方法介绍
			
1. bc命令的用法: bc是unix下的计算器,它也可以用在命令行下面: 例:给自变量i加1 i=2 i=`echo $i + 1|bc` --------效率低 因为bc支持科学计算 ...
 - BASH让标准输出和错误输出颜色不同
			
shell中运行的程序输出有标准输出(stdout)和错误输出(stderr)两种.当在终端中运行一个进程时,默认是stdout和stderr混在一起的,需要区分只能去读内容,人眼不容易快速区分. 如 ...
 - windbg加载符号表
			
0x00 前言 在使用windbg调试windows中的程序时会经常碰到一些系统的dll里面的一些函数调用,有些函数是没有具体函数名的,这对于调试非常不利,基于此,微软针对windows也发布了很多系 ...
 - php超全局数组 为什么swoole的http服务不能用
			
php的超全局数组$_GET等九个 可以直接使用 无需定义 实际上是浏览器请求到Apache或者nginx的时候 转发到PHP处理模块 fpm转发给php解释器处理 php封装好后丢给php的 sw ...
 - 自动化遍历-appcrawler
			
下载appclawler 下载地址:https://pan.baidu.com/s/1dE0JDCH#list/path=%2F 查看帮助文档: java -jar appcrawler-2.4.0- ...