CF1178F Short/Long Colorful Strip(DP)
说起来,这题好像也不难……
先考虑 F1 怎么做。
既然别的方法都不行不如试试\(f_{i,j}\) 表示在刚刚准备开始涂 \([i,j]\) 中最小编号的颜色之前,整个区间是同色的,且最后能做到 \([i,j]\) 变成要求的颜色,且所有连续颜色段要么完全在 \([i,j]\) 内,要么完全在 \([i,j]\) 外的方案数。(有点绕,好好理解一下)
那么先找到区间 \([i,j]\) 中的最小值 \(c\),下一步染色的区间 \([l,r]\) 一定要满足 \(i\le l\le r\le j\) 且包括 \(p_c\),其中 \(p_c\) 是 \(c\) 出现的位置。
由于染色后,\([l,r]\) 内同色且与不在 \([l,r]\) 内的异色,那么整个带子变成了四块。(图片来源:官方题解)

这是因为,\(p_c\) 永远不能被重新染色,就把两边分开了;\([l,r]\) 内和 \([l,r]\) 外的已经不同色,后面也不可能变得同色。
那么这四部分可以单独处理。
就有转移方程:\(f_{i,j}=\sum\limits_{l=i}^{p_c}\sum\limits_{r=p_c}^jf_{i,l-1}f_{l,p_c-1}f_{p_c+1,r}f_{r+1,j}\)。这里由于一些边界原因,不妨设 \(f_{i+1,i}=1\)。
这是一个 \(O(n^4)\) 做法(在 F1 中 \(n=m\))。优化的话,发现 \(l\) 和 \(r\) 在转移中独立。可以重写:\(f_{i,j}=(\sum\limits_{l=i}^{p_c}f_{i,l-1}f_{l,p_c-1})(\sum\limits_{r=p_c}^jf_{p_c+1,r}f_{r+1,j})\)
时间复杂度 \(O(n^3)\)。还有个大概 \(\frac{1}{6}\) 的常数。
接下来看看 F2。
首先这个 \(m\) 太大了,无论如何都不能直接区间 DP。
找找性质:
性质 1:如果两个方格某个时刻开始不同色,那么它们会一直不同色。反过来,如果两个方格最后同色,那么它们始终同色。
所以,不妨把连续一段相等的压成一个,不影响答案。
性质 2:把 \(c_i\ne c_{i+1}\) 的 \(i\) 叫做转折点。那么一次染色最多增加两个转折点。
所以,压缩后如果 \(m>2n\),这一定是不可能做到的,直接输出 \(0\)。
那么接下来 \(m\le 2n\),基本上可以按上面的方法来做。不过要稍微修改一下。
比如考虑序列 2,1,2,答案明显是 \(0\)。但是我们上面的做法会用 1 把两边分开单独考虑。
为什么会错呢?因为此时两边不独立。
其实解决方法也很简单,每次判一下是不是序列中所有 \(c\) 都在这个区间中。如果不是的话,给这个区间染色后不可能做到里面是 \(c\),外面也是 \(c\)。
同时,此时这个区间也分成了不止四段。不过问题不大,前后四段还是通过上面的方法转移,中间几段是一定取满的,直接乘上去就好了。
时间复杂度 \(O(n^3+m)\),有个大概 \(\frac{4}{3}\) 的常数。在 CF 神机+ 6s 时限下完全不用怕。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=1111,mod=998244353;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=0,f=0;
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,m_,a[1111111],lft[maxn],rig[maxn],f[maxn][maxn];
int main(){
n=read();m_=read();
while(m_--){
int x=read();
if(x!=a[m]) a[++m]=x;
}
if(m>2*n) return puts("0"),0;
MEM(lft,0x3f);
FOR(i,1,m) lft[a[i]]=min(lft[a[i]],i),rig[a[i]]=max(rig[a[i]],i);
FOR(i,1,m) if(lft[a[i]]==i && rig[a[i]]==i) f[i][i]=1;
FOR(i,0,m) f[i+1][i]=1;
FOR(l,2,m) FOR(i,1,m-l+1){
int j=i+l-1,mn=i;
FOR(k,i+1,j) if(a[k]<a[mn]) mn=k;
int x=lft[a[mn]],y=rig[a[mn]],s1=0,s2=0,pre=0;
if(x<i || y>j) continue;
FOR(k,i,x) s1=(s1+1ll*f[i][k-1]*f[k][x-1])%mod;
FOR(k,y,j) s2=(s2+1ll*f[y+1][k]*f[k+1][j])%mod;
f[i][j]=1ll*s1*s2%mod;
FOR(k,i,j) if(a[k]==a[mn]){
if(pre) f[i][j]=1ll*f[i][j]*f[pre+1][k-1]%mod;
pre=k;
}
}
printf("%d\n",f[1][m]);
}
CF1178F Short/Long Colorful Strip(DP)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- DFS(三):八皇后问题
[例1]八皇后问题. 在一个8×8国际象棋盘上,放置8个皇后,每个皇后占一格,要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行.同一列或同一对角线上.问共有多少种不同的放置方法? (1 ...
- jquery ajax怎么使用jsonp跨域访问
在项目中使用接口的比较多,在客户端跨域访问,jquery中只能使用jquery ajax的jsonp方法. 值得注意的是,jQuery.ajax()只支持get方式的跨域,post的方式是不支持的.& ...
- python中easydict的简单使用
easydict的作用:EasyDict可以使得以属性的方式去访问字典的值! 1. 实例1:获取字典的值 2. 实例2: 设置属性 3. 在深度学习中往往利用easydict建立一个全局的变量
- win10每次开机都会自检系统盘(非硬件故障)——解决方案2019.07.12
1.最近反复遇到了这个问题,之前遇到这个问题就把系统重装了,没想到今天又遇到了,目前系统东西太多了,重装太麻烦了,就下决心解决一下. 2.不要使用网络上流传的修改注册表的方案,把注册表的那个键值删除那 ...
- 【Java面试题】short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
昨天去面试,虽然体验不是很好, 但是看到了这个面试题,当时感觉无从下手,所以在这里记录一下. 解决这道题之前,先复习一下Java的基本数据类型转换规则,以便后面对面试题的理解. java的基本数据类型 ...
- ASP.NET 里身份验证安全相关配置
安全相关的 <authorization > <allow verbs = "" users = "" roles = "" ...
- CSS 控制文字两端对齐
<html> <head> <style> td:after { content: ''; } td p{ font-size: 14px; width: 5em; ...
- 排障利器之远程调试与监控 --jmx & remote debug
监控和调试功能是应用必备的属性之一,其手段也是多种多样. 一般地,我们可以通过:线上日志, zabbix, grafana, cat 等待系统做一问题留底,有问题及时报警,从而达到监控效果. 而对于应 ...
- internet信息服务(IIS)管理器 在哪里?
我们在搭建网络配置时就需要找到internet信息服务(IIS)管理器,下面我们就来看看internet信息服务(IIS)管理器在哪里能够找到. 工具/材料 使用工具:电脑 01 02 03 04 0 ...
- ASP.NET Core 开发人员异常页面
UseDeveloperExceptionPage 中间件 我们谈谈在 Startup 类的 Configure()方法中以下代码: public void Configure(IApplicatio ...