【ARC074e】RGB sequence
Description
一排\(n\)个格子,每个格子可以涂三种颜色的一种。现在给出\(m\)个形如“\([l,r]\)中必须恰好有\(x\)种颜色"的限制(\(1 \le l \le r \le n, 1 \le x \le 3\))。
求一共有多少种满足所有限制的合法涂色方案。
答案对\(10^9+7\)取模。
Solution
首先要想到状态表示法,如何表示才能适应这些限制呢?由于是限制颜色种类数,可以考虑最早出现位置这类套路。
设\(f_{i,j,k}\)表示:当前走完\(1...i\),在\(i\)左边最靠右的、与\(i\)颜色不同的位置为\(j\),在\(j\)左边最靠右的、与\(i\)和\(j\)颜色不同的位置为\(k\)时,目前合法染色方案数是多少。
逐步计算\(f_1,f_2,...\)。
接下来考虑限制。考虑在转移的时候逐一枚举限制来判断新状态是否合法。
则总复杂度是\(\mathcal O(n^3m)\)的。还有3倍常数,显然不够优秀。
然而这只是臆想做法,具体我也没实现出来,因为枚举限制的时候,限制的区间和\(i,j,k\)的位置的关系实在太多,不好写。
实际上,对于一个\([l,r]\)的限制,它只需要去管\(i==r\)的那些状态是否合法即可。如果\(i<r\),那么显然还没有考虑的必要(都没填完\([l,r]\),考虑什么呢?)。如果\(r<i\)那么已经晚了。所以每个条件至多被枚举一次。
因此总复杂度是\(\mathcal O (n^2(n+m))\)的。
所以下次觉得枚举限制条件十分复杂且时间复杂度爆炸的时候,不妨想一想限制条件或许只针对特定对象才起效果或必要,这样就可以减少总枚举次数,优化复杂度。
Code
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
#define mp make_pair
using namespace std;
typedef pair<int,int> pii;
const int N=310;
const int MOD=1e9+7;
int n,m;
int f[N][N][N];
vector<pii> lis[N];
void readData(){
scanf("%d%d",&n,&m);
int l,r,x;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&l,&r,&x);
lis[r].pb(mp(l,x));
}
}
void dp(){
f[1][0][0]=1;
for(int i=1;i<=n;i++){
for(int d=0,sz=lis[i].size();d<sz;d++){
int l=lis[i][d].first,x=lis[i][d].second;
for(int j=0;j<i;j++)
for(int k=0;k<=(j-(j>0));k++){
if(x==1){
if(l<=j) f[i][j][k]=0;
}
else if(x==2){
if(l<=k||j<l) f[i][j][k]=0;
}
else{
if(k<l) f[i][j][k]=0;
}
}
}
if(i==n) break;
for(int j=0;j<i;j++)
for(int k=0;k<=(j-(j>0));k++)
if(f[i][j][k]){
(f[i+1][j][k]+=f[i][j][k])%=MOD;
(f[i+1][i][k]+=f[i][j][k])%=MOD;
(f[i+1][i][j]+=f[i][j][k])%=MOD;
}
}
int ans=0;
for(int j=0;j<n;j++)
for(int k=0;k<=(j-(j>0));k++)
(ans+=f[n][j][k])%=MOD;
ans=1LL*ans*3%MOD;
printf("%d\n",ans<0?ans+MOD:ans);
}
int main(){
readData();
dp();
return 0;
}
【ARC074e】RGB sequence的更多相关文章
- 【arc074e】RGB Sequence(动态规划)
[arc074e]RGB Sequence(动态规划) 题面 atcoder 洛谷 翻译见洛谷 题解 直接考虑暴力\(dp\),设\(f[i][j][k][l]\)表示当前考虑到第\(i\)位,最后一 ...
- 【arc074e】RGB Sequence dp
Description 丰泽爷今天也在愉快地玩Minecraft! 现在丰泽爷有一块1∗N1∗N的空地,每个格子按照顺序标记为11到NN.丰泽爷想要在这块空地上铺上红石块.绿宝石块和钻石块作为 ...
- 【XSY3209】RGB Sequence
题目 传送门 解法 用\(f_{i, j, k}\)表示有\(i\)个红石块, \(j\)个绿宝石块, \(k\)个钻石块 可以转移到\(f_{p+1, j, k}\). \(f_{i, p+1,k ...
- 【arc071f】Infinite Sequence(动态规划)
[arc071f]Infinite Sequence(动态规划) 题面 atcoder 洛谷 题解 不难发现如果两个不为\(1\)的数连在一起,那么后面所有数都必须相等. 设\(f[i]\)表示\([ ...
- 【BZOJ1367】[Baltic2004]sequence 左偏树
[BZOJ1367][Baltic2004]sequence Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sampl ...
- 【BZOJ3043】IncDec Sequence 乱搞
[BZOJ3043]IncDec Sequence Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要 ...
- 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)
[C#]RGB,CMYK,HSB各种颜色表示的转换 一.表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等 1.RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合 ...
- T89353 【BIO】RGB三角形
T89353 [BIO]RGB三角形 题解 对于这个题目有一个规律: 如果一个数列的长度为 3k+1(0<=k) 那么,这个数列最终缩放成的一个字母只和这个数列的首项,尾项有关 所以我们可以先 ...
- 【AGC025B】RGB Color
[AGC025B]RGB Color 题面描述 Link to Atcoder Link to Luogu Takahashi has a tower which is divided into \( ...
随机推荐
- 【SIKIA计划】_03_C#初级教程 (2015版)笔记
Win32 API是微软的操作系统Windows提供给开发人员的编程接口,它决定了我们开发的Windows应用程序的能力.MFC是微软为开发人员提供的类库,在某种意义上是对Win32 API的封装.M ...
- 2.2 Oracle之DML的SQL语句之多表查询以及组函数
一.SQL的多表查询: 1.左连接和右连接(不重要一方加(+)) SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHE ...
- 启动docker 端口映射时IPV4无法使用
CentOS7 Docker启动一个web服务,使用端口映射报错: WARNING: IPv4 forwarding is disabled. Networking will not work. 查找 ...
- Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第6节: 异线程回收对象
Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第六节: 异线程回收对象 异线程回收对象, 就是创建对象和回收对象不在同一条线程的情况下, 对象回收的逻辑 我 ...
- 关于几个与IO相关的重要概念
1.读/写IO 读IO就是发指令从磁盘读取某段序号连续的扇区内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读还是写.磁盘收到这条指令就会按照指令 ...
- 高可用OpenStack(Queen版)集群-17.一些问题
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- IIS6/IIS7环境下实现支持mp4视频随意拖动、预览播放、边下载边播放
前几天,一客户需要在IIS环境下实现MP4视频可以随意拖动观看,边下载边播放.一看这要求,IIS本身是无法实现,想着应该需要用插件,于是GG一番,还真找到这样的插件,此组件为H264-Streamin ...
- React Native iOS 离线包
平时使用React Native 时候, js代码和图片资源运行在一个Debug Server上(需要cd 到RN目录,然后终端执行 npm start 命令开启本地服务 ).每次更新代码之后只需要使 ...
- Aspose.words Java基于模板生成word之循环图片
1.新建一个word文档 2.给插入图片的地方设置书签 3,设置书签 二,项目 1,2步的引入依赖以及加载授权文件同上一篇 3,获取图片路径插入到word中并生成新的word文档 新文档中,每行显示两 ...
- 20172319 实验三 《敏捷开发与XP实践》 实验报告
20172319 2018.05.17-30 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20 ...