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)) ... 
随机推荐
- 2019.7.12 sdfzoier做题统计
			lixf_lixf :9 P1981 表达式求值 P1076 寻宝 P1199 三国游戏 P1308 统计单词数 P1190 接水问题 P1158 导弹拦截 P1070 道路游戏 P1069 细胞分裂 ... 
- Linux 虚拟机绑定静态 IP
			环境介绍 Machine: NUC8i5BEK OS: macOS Catalina 10.15.6 VirtualBox: 6.1.12 r139181 (Qt5.6.3) CentOS: 8.2. ... 
- linux 重启服务器命令
			Linux有如下的关机和重启命令:shutdown, reboot,poweroff, halt shutdown shutdown命令是大家都推荐的一个安全的命令,通过参数-h或-r的配合来完成关机 ... 
- Java 审计之XXE篇
			Java 审计之XXE篇 0x00 前言 在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过.下面来 深入了解一下该漏洞的产生和利用. 0x01 XXE漏洞 当程序在解析XML输入时, ... 
- Power Designer建模之餐饮在线点评系统——业务处理模型
			餐饮在线点评系统除查看会员促销活动.查看站内消息等简单业务流程外,相对复杂的业务流程包括管理员注册餐厅,发布餐厅信息,餐厅信息主要包括特色菜.促销活动.团购活动和优惠券信息. 餐厅信息发布后,用户可以 ... 
- Java知识系统回顾整理01基础03变量07final关键字
			一.final赋值 final 修饰一个变量,有很多种说法,比如不能改变等等 准确的描述是 当一个变量被final修饰的时候,该变量只有一次赋值的机会 二.在声明的时候赋值 i已经被赋值为5,所以这里 ... 
- 轻轻松松学CSS:Flex布局
			Flex布局就是"弹性布局",它可以简便.完整.响应式地实现各种页面布局.引入弹性布局的目的,当页面需要适应不同的屏幕大小确保元素拥有恰当的布局方式,对一个容器中的子元素进行排列 ... 
- 史上最全Python快速入门教程,满满都是干货
			Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力.Python的语法和动态类型具有其解释性质,使其成为许 ... 
- ubuntu20 使用命令安装 nginx
			安装 nginx sudo apt-get install nginx -y 配置文件 nginx 服务管理 # 启动 nginx 服务 service nginx start # 关闭 nginx ... 
- js 递归的理解
			友情提示:阅读本文需花 3分钟左右! 递归函数必须接受参数. (比如我要递归谁?) 在递归函数的定义初始,应该有一个判断条件,当参数满足这个条件的时候,函数停止执行,并返回值.(指定退出条件,否则就会 ... 
