Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
long long f[200007][2],g[200007][2];
long long a[200007],b[200007],c[200007];
int n,k,cnt1,cnt2;
long long qpow(long long a,long long p){
long long ans=1;
while(p){
if(p&1)
ans=ans*a%mod;
a=a*a%mod;
p>>=1;
}
return ans;
}
long long solve(long long *a,int n,int k){
for(int i=2;i<=n;i++)
if(a[i]==a[i-1]&&a[i]!=-1)//一定有奇数回文串,无法构造出good串
return 0;
int p=0;
for(int i=1;i<=n;i++)
if(a[i]!=-1)
p++;
if(!p)
return qpow(k-1,n-1)*k%mod;//第一个随意选,剩下的选择和前一个不同的
else if(p==1)
return qpow(k-1,n-1);//选的和相邻的不同的
else{
if(p==n)
return 1;//没有构造余地,全部已经安排好了
if(k==1)//构造不出,一定会存在1?1只羊这样的回文串
return 0;
long long res=1;
int l=0,r=0;
for(int i=1;i<=n;i++){
if(a[i]!=-1){
l=i+1;
break;
}
res=res*(k-1)%mod;//-1只要构造和相邻的不同即可
}
for(int i=n;i;i--){
if(a[i]!=-1){
r=i;
break;
}
res=res*(k-1)%mod;//-1只要构造和相邻的不同即可
}
long long tmp=0;
long long last=a[l-1];//上一个已经确定的a[i]
for(int i=l;i<=r;i++){
if(a[i]!=-1){
if(!tmp){//前一个也已经确定
last=a[i];//更新最新一个确定的a[i]后继续
continue;
}
if(a[i]!=last)//两端数字不同
res=res*f[tmp][0]%mod;
else//两端数字相同
res=res*g[tmp][0]%mod;
tmp=0;//归零
last=a[i];//更新
}
else
tmp++;//增加中间-1的长度
}
return res;
}
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
//f和g类似染色,预处理出除了两端不是-1中间全都是-1能有多少种安排情况
f[1][0]=k-2;//表示两端数字不同时,第一维和结尾不同的方案数,k-2因为要和两边都不同
f[1][1]=1;//表示两端数字不同时,第一维和结尾相同的方案数,1因为下一个就可以在和上一个相同的那一段中间插入一个
g[1][0]=k-1;//表示两端数字相同时,第一维和结尾不同的方案数,k-1因为两边是相同的
g[1][1]=0;//表示两端数字相同时,第一维和结尾相同的方案数,0因为下两个才可以在最初两边都插一个
for(int i=2;i<=n/2+1;i++){//染色DP,分开讨论,每次在前面的情况后面加上一个
f[i][0]=(f[i-1][0]*(k-2)%mod+f[i-1][1]*(k-1)%mod)%mod;
f[i][1]=f[i-1][0];
g[i][0]=(g[i-1][0]*(k-2)%mod+g[i-1][1]*(k-1)%mod)%mod;
g[i][1]=g[i-1][0];
}
for(int i=1;i<=n;i+=2)
b[++cnt1]=a[i];//分离出下标为奇数的a[i]
for(int i=2;i<=n;i+=2)
c[++cnt2]=a[i];//分离出下标为偶数的a[i]
long long ans=solve(b,cnt1,k);
ans=ans*solve(c,cnt2,k)%mod;
printf("%lld",ans);
return 0;
}
Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)的更多相关文章
- Educational Codeforces Round 73 (Rated for Div. 2)D(DP,思维)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[300007],b[3 ...
- Educational Codeforces Round 69 (Rated for Div. 2)D(DP,思维)
#include<bits/stdc++.h>using namespace std;int a[300007];long long sum[300007],tmp[300007],mx[ ...
- Educational Codeforces Round 102 (Rated for Div. 2) B. String LCM (构造,思维)
题意:给你两个字符串\(a\)和\(b\),找出它们的\(lcm\),即构造一个新的字符串\(c\),使得\(c\)可以由\(x\)个\(a\)得到,并且可以由\(y\)个\(b\)得到,输出\(c\ ...
- Educational Codeforces Round 62 (Rated for Div. 2) Solution
最近省队前联考被杭二成七南外什么的吊锤得布星,拿一场Div. 2恢复信心 然后Div.2 Rk3.Div. 1+Div. 2 Rk9,rating大涨200引起舒适 现在的Div. 2都怎么了,最难题 ...
- Educational Codeforces Round 62 (Rated for Div. 2)
A. Detective Book 题意:一个人读书 给出每一章埋的坑在第几页可以填完 . 一个人一天如果不填完坑他就会一直看 问几天能把这本书看完 思路:模拟一下 取一下过程中最大的坑的页数 如 ...
- Educational Codeforces Round 62 (Rated for Div. 2) C 贪心 + 优先队列 + 反向处理
https://codeforces.com/contest/1140/problem/C 题意 每首歌有\(t_i\)和\(b_i\)两个值,最多挑选m首歌,使得sum(\(t_i\))*min(\ ...
- Educational Codeforces Round 62 (Rated for Div. 2)C
题目链接 :C. Playlist #include<bits/stdc++.h> using namespace std; #define maxn 300005 #define LL ...
- Educational Codeforces Round 62 (Rated for Div. 2) - C Playlist
当时题意看错了...不过大致思路是对的,唯一没有想到的就是用优先队列搞这个东西,真是不该啊... 题意大概就是,有N首歌,N首歌有两个东西,一个是长度Ti,一个是美丽值Bi,你最多可以选择K首歌, 这 ...
- C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列
C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
随机推荐
- git学习3 - 克隆远程库到本地 将本地库上传到git
如何克隆远程版本库到本地 git clone URL 如何用命令将本地项目上传到git 1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 (注意: cd C:/U ...
- Fragment的陷阱:概述
现在主流的APP都会使用到Fragment,相信你也一定使用过,今天为大家介绍一下我曾经踏过的一个关于Fragment的坑. 以前做过的一个项目,Fragment嵌套高德地图,当再次进入Fragmen ...
- win10系统怎么关闭自动更新
现在win10已经很普遍了,对于win10 现在还不是很完美,比如自动更新功能,现在的选项中没有关闭自动更新的选项了,这是一个bug,微软要强制更新.我就忍受不了自动更新,会拉取网络,影响我们的上网体 ...
- Py修行路 python基础 (十七)property 静态方法 类方法
一.property 属性 特性 (装饰器是可调用对象,被装饰对象也是可调用对象) 1.在类内函数属性上添加一个@property,就会对函数属性进行伪装. import math class C ...
- IDA Pro 权威指南学习笔记(二) - IDA 数据库文件
生成数据库文件 把要分析的文件用 IDA 打开后,会生成 3 个数据库文件 扩展名分别为 .id0,id1,nam .id0 文件是一个二叉树形式的数据库 .id1 文件包含描述每个程序字节的标记 . ...
- python学习——练习题(1)
""" 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? """ import itertools d ...
- Java微信公众平台开发(九)--关键字回复以及客服接口实现(该公众号暂时无法提供服务解决方案)
转自:http://www.cuiyongzhi.com/post/47.html 我们在微信公众号的后台可以发现微信给我们制定了两种模式,一种是开发者模式(也就是我们一直在做的开发),还有一种模式是 ...
- Listview使用安卓自带布局实现单选
安卓提供了一些自带的布局,使用非常简单.直接看代码吧. package com.example.linfeng.myapplication; import android.app.Activity; ...
- SELINUX配置
今天试着将centos7的ssh默认端口改成1234,但改了后,SSHD服务竟然启动不了了.后来关了selinux测试,果然可以了.但这是运行环境,不能关,所以不得不配置semanage! 一.安装s ...
- Areas in ASP.NET MVC 4
Download source - 2.7 MB Introduction to Areas In this article, we will learn the concept of Areas a ...