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

题解:初始思想是设置一个dp[][],数组第一维代表当前连续长度,第二维代表选择的数字。那最终答案就是最后的dp数组元素之和。

   然后考虑更新这个数组:

     当前元素是-1的话,那么对于每个dp[1][x] (1<=x<=k),他就是上一次dp数组元素之和 - 上一次符合dp[i][x]的元素之和(也就是去掉自己,把别的都加上)。

   对于每个dp[i][x] (1<i<len, 1<=x<=k),他就是上一次对应的dp[i - 1][x]。①

   当前元素不是-1,那么对于当前元素对应的值x,更新方法是一样的。与此同时,把别的不等于当前元素的值的dp数组清空。

   接着考虑len的限制,那么len的限制其实就是要我们在更新dp的同时,去掉某个元素连续长度大于等于len的部分。②

   也就是说对于更新提出了两个要求,第一个就是可以快速滑动(①要求),第二个就是快速删除位于一端的数字(②要求),那么队列可以很好的满足要求。

#include<bits/stdc++.h>
using namespace std;
const int P = 998244353;
int a[100005], S[108], sum[108][2];
queue<int> q[108];
int main(){int n, k, len, Sum[2];scanf("%d%d%d", &n, &k, &len);for(int i = 1; i <= n; i++){scanf("%d", a + i);}if(k == 1){if(len <= n) return puts("0"),0;else return puts("1"),0; }if(len == 1) return puts("0"),0;if(a[1] == -1){for(int i = 1; i <= k; i++) S[i] = sum[i][0] = 1, q[i].push(1);Sum[0] = k;}else S[a[1]] = sum[a[1]][0] = 1, q[a[1]].push(1), Sum[0] = 1;for(int i = 2; i <= n; i++){int ii = i & 1;Sum[ii ^ 1] = 0;if(a[i] == -1){for(int j = 1; j <= k; j++){q[j].push((Sum[ii] - sum[j][ii] + P) % P);sum[j][ii ^ 1] = Sum[ii];if(++S[j] == len) {--S[j];sum[j][ii ^ 1] = (sum[j][ii ^ 1] - q[j].front() + P) % P;q[j].pop();}Sum[ii ^ 1] = (Sum[ii ^ 1] + sum[j][ii ^ 1]) % P;}}else{q[a[i]].push((Sum[ii] - sum[a[i]][ii] + P) % P);sum[a[i]][ii ^ 1] = Sum[ii];if(++S[a[i]] == len) {--S[a[i]];sum[a[i]][ii ^ 1] = (sum[a[i]][ii ^ 1] - q[a[i]].front() + P) % P;q[a[i]].pop();}for(int j = 1; j <= k; j++) if(j != a[i]){while(!q[j].empty()) q[j].pop();sum[j][ii ^ 1] = 0;S[j] = 0;}Sum[ii ^ 1] = sum[a[i]][ii ^ 1];}}printf("%d\n", Sum[((n + 1) & 1)]);
} 

转载于:https://www.cnblogs.com/mfys/p/10136255.html

Educational Codeforces Round 56 (Rated for Div. 2) F. Vasya and Array相关推荐

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

    有一个长度为nnn的的数列,aia_iai​的值域只有kkk个元素. 一个数列有一些数字已经填上.现在要求数列连续的数字长度不能超过lll,问所有不同的数列的个数有多少个. 1.考虑所有的数字都没填上 ...

  2. Educational Codeforces Round 73 (Rated for Div. 2) F. Choose a Square 线段树 + 二维转一维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),每个点有个价值cic_ici​,现在你可以框一个正方形,要求左下角和右上角的坐标(x,y)( ...

  3. Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

    传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...

  4. Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))...

    题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一 ...

  5. Educational Codeforces Round 41 (Rated for Div. 2) F. k-substrings

    F. k-substrings time limit per test 4 seconds memory limit per test 256 megabytes input standard inp ...

  6. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  7. Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞

    传送门 题意: 给一个二进制串aaa,让后定义两个串相似为有至少一个相同位置相等.现在让你找一个字典序最小的长度为kkk的串使其与aaa中每个长度为kkk的字串相似. 思路: 首先我们知道所有可能的串 ...

  8. Educational Codeforces Round 54 (Rated for Div. 2): E. Vasya and a Tree(DFS+差分)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  9. Educational Codeforces Round 87 (Rated for Div. 2) F. Summoning Minions

    题目链接 Polycarp plays a computer game. In this game, the players summon armies of magical minions, whi ...

  10. Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

    Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...

最新文章

  1. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness
  2. C语言经典例18-求累加和
  3. 一个毕业生对大学爱情和奋斗的思考!
  4. 实例构造器和类(引用类型)
  5. 红帽:IaaS与PaaS齐头并进
  6. 【JavaScript】查漏补缺 —数组中reduce()方法
  7. Oracle分析函数Over()
  8. mysql开启远程可连接
  9. 10.数据管理(内存,文件锁)
  10. Unity web聊天通讯功能开发(1)
  11. 嵌入式学习(三)—— STM32入门
  12. 倒排索引的MapReduce实现
  13. Word 公式编辑器: 公式居中,编号居右,带章节号自动更新,且可以交叉引用
  14. 淘宝账号 支付宝账号 阿里旺旺账号
  15. 可用于SDR的C语言纠错编码通用算法收集(1)-朴素字典查表BCH纠错
  16. Linux系统基础小白学习(更新中)
  17. 舆情监测系统平台对网络舆情监测的作用
  18. 数据采集—数据采集技术
  19. python彩色蟒蛇绘制方向_Python绘制彩色蟒蛇
  20. Unity DOTS系统概览

热门文章

  1. [case31]dubbo-spring-boot-starter小试牛刀
  2. 62. KVOController详解
  3. Laravel Blade 模板用法
  4. 通信工程领域当前的主流技术及其社会需求调查报告
  5. Linux之Inode详解 作者:羽飞博客 http://www.opsers.org/
  6. 做人要有一颗健康的心
  7. arraylist linkedlist vector 三者区别
  8. 用 Java 爬小姐姐图片,直接拿来用!这个厉害了。。。
  9. 自从在 IDEA 中用了热部署神器 JRebel,开发效率提升了 10 倍!
  10. 一个注解搞定 Spring Boot 日志!还有谁不会?