Educational Codeforces Round 56 (Rated for Div. 2) F. Vasya and Array
题意:长度为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 = ;
int a[], S[], sum[][];
queue<int> q[];
int main(){
int n, k, len, Sum[];
scanf("%d%d%d", &n, &k, &len);
for(int i = ; i <= n; i++){
scanf("%d", a + i);
}
if(k == ){
if(len <= n) return puts(""),;
else return puts(""),;
}
if(len == ) return puts(""),;
if(a[] == -){
for(int i = ; i <= k; i++) S[i] = sum[i][] = , q[i].push();
Sum[] = k;
}
else S[a[]] = sum[a[]][] = , q[a[]].push(), Sum[] = ; for(int i = ; i <= n; i++){
int ii = i & ;
Sum[ii ^ ] = ;
if(a[i] == -){
for(int j = ; j <= k; j++){
q[j].push((Sum[ii] - sum[j][ii] + P) % P);
sum[j][ii ^ ] = Sum[ii];
if(++S[j] == len) {
--S[j];
sum[j][ii ^ ] = (sum[j][ii ^ ] - q[j].front() + P) % P;
q[j].pop();
}
Sum[ii ^ ] = (Sum[ii ^ ] + sum[j][ii ^ ]) % P;
}
}
else{
q[a[i]].push((Sum[ii] - sum[a[i]][ii] + P) % P);
sum[a[i]][ii ^ ] = Sum[ii];
if(++S[a[i]] == len) {
--S[a[i]];
sum[a[i]][ii ^ ] = (sum[a[i]][ii ^ ] - q[a[i]].front() + P) % P;
q[a[i]].pop();
}
for(int j = ; j <= k; j++) if(j != a[i]){
while(!q[j].empty()) q[j].pop();
sum[j][ii ^ ] = ;
S[j] = ;
}
Sum[ii ^ ] = sum[a[i]][ii ^ ];
}
}
printf("%d\n", Sum[((n + ) & )]);
}
Educational Codeforces Round 56 (Rated for Div. 2) F. 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 Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块
Educational Codeforces Round 71 (Rated for Div. 2)-F. Remainder Problem-技巧分块 [Problem Description] ...
- Multidimensional Queries(二进制枚举+线段树+Educational Codeforces Round 56 (Rated for Div. 2))
题目链接: https://codeforces.com/contest/1093/problem/G 题目: 题意: 在k维空间中有n个点,每次给你两种操作,一种是将某一个点的坐标改为另一个坐标,一 ...
- Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph 【规律 && DFS】
传送门:http://codeforces.com/contest/1093/problem/D D. Beautiful Graph time limit per test 2 seconds me ...
- Educational Codeforces Round 56 (Rated for Div. 2) ABCD
题目链接:https://codeforces.com/contest/1093 A. Dice Rolling 题意: 有一个号数为2-7的骰子,现在有一个人他想扔到几就能扔到几,现在问需要扔多少次 ...
- Educational Codeforces Round 56 (Rated for Div. 2) D
给你一个无向图 以及点的个数和边 每个节点只能用1 2 3 三个数字 求相邻 两个节点和为奇数 能否构成以及有多少种构成方法 #include<bits/stdc++.h> usin ...
- Educational Codeforces Round 56 (Rated for Div. 2)
涨rating啦.. 不过话说为什么有这么多数据结构题啊,难道是中国人出的? A - Dice Rolling 傻逼题,可以用一个三加一堆二或者用一堆二,那就直接.. #include<cstd ...
- Educational Codeforces Round 56 (Rated for Div. 2) E(1093E) Intersection of Permutations (树套树,pb_ds)
题意和分析在之前的链接中有:https://www.cnblogs.com/pkgunboat/p/10160741.html 之前补题用三维偏序的cdq的分治A了这道题,但是感觉就算比赛再次遇到类似 ...
随机推荐
- 透彻理解C++11新特性:右值引用、std::move、std::forward
目录 浅拷贝.深拷贝 左值.右值 右值引用类型 强转右值 std::move 重新审视右值引用 右值引用类型和右值的关系 函数参数传递 函数返还值传递 万能引用 引用折叠 完美转发 std::forw ...
- GithubAction-Deploy
GithubAction-Deploy githubhexoaction 使用 github action 自动化部署 创建GitHub repository 存放源文件 在repo设置界面里添加Se ...
- asp.net下载大文件代码
public void Down(string filepath, HttpResponse aResponse) { System.IO.Stream iStream = null; // Buff ...
- dlopen failed: empty/missing DT_HASH in "libx.so" (built with --hash-style=gnu?)
崩溃日志内容: java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH in "libxxxx.so&quo ...
- 【阅读笔记】Ranking Relevance in Yahoo Search (三)—— query rewriting
5. QUERY REWRITING 作用: query rewriting is the task of altering a given query so that it will get bet ...
- Centos7网络配置( 网关、dns、ip地址配置)
0.前提:设置VMware的虚拟网络编辑器 子网和网关设置 虚拟网络编辑器 1.配置DNS(可忽略) $vim /etc/resolv.conf nameserver 192.168.0.1 2. ...
- 一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
一般来说linux下比较大型的程序都是以配置文件作为参数介质传递的,该爬虫也采用配置文件的方式来获取参数,配置文件格式大致如下: max_job_num=1 #seeds=https://www.ba ...
- 面试中的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的内容.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...
- 网上流行护眼色的RGB值和颜色代码
网上流行护眼色的RGB值和颜色代码 绿豆沙色能有效的减轻长时间用电脑的用眼疲劳!色调:85,饱和度:123,亮度:205: RGB颜色红:199,绿:237,蓝:204:十六进制颜色:#C7EDC ...
- 教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了
一:背景 1. 讲故事 前几天公众号里有位兄弟看了几篇文章之后,也准备用windbg试试看,结果这一配就花了好几天,(づ╥﹏╥)づ,我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题,所 ...