[AGC026D]Histogram Coloring

题目描述

题面

题意大概是有一个nnn列网格图,给定一个长度为nnn的序列hih_ihi​,第iii列只保留这一列最下面的hih_ihi​个格子。

现在需要给这些保留下来的格子染成红色或蓝色,满足每一个完整的2×22×22×2正方形满足有分别有两个格子是红色或蓝色。

Solution

我们考虑一段连续的已经染色的格子,倘若这些格子的上面一行也是连续的,那么上面一行的格子的染色方案为当前行取反或与当前行相同两种方案。

对于取反这一种方案一定是可行的。
对于相同这一种方案可行当且仅当当前行没有相邻的两个格子颜色相同。

对于每一行的每一个极长的连续段,倘若这一段在底层是红蓝间隔的,则方案数×2,否则方案数不变。

我们只要知道最底层一行的染色方案,就可以求出以其为底层的整个网格图的方案数。

于是我们设f[i][j]f[i][j]f[i][j]表示底层前iii个格子,末尾有jjj个极长连续红蓝间隔格子的方案数,统计有多少个连续段在[i−j+1,i][i-j+1,i][i−j+1,i]之间,DP即可。

时间复杂度O(n3lg⁡n)O(n^3\lg n)O(n3lgn),可以容易地优化到O(n2lg⁡n)O(n^2\lg n)O(n2lgn)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const int MAXN=205;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<PR> e[MAXN];
int a[MAXN],f[MAXN][MAXN],g[MAXN][MAXN],b[MAXN];
int upd(int x,int y){ return x+y>=mods?x+y-mods:x+y; }
int quick_pow(int x,int y)
{int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret;
}
int main()
{int n=read();for (int i=1;i<=n;i++) a[i]=b[i]=read();sort(b+1,b+n+1);for (int i=1,lst=0;i<=n;i++){b[i]--;if (b[i]!=b[i-1]) {int id=-1;for (int j=1;j<=n;j++)if (a[j]-1>=b[i]&&a[j-1]-1<b[i]) id=j;else if (a[j-1]-1>=b[i]&&a[j]-1<b[i]) e[j-1].PB(MP(id,b[i]-lst)),id=-1;if (id>0) e[n].PB(MP(id,b[i]-lst));lst=b[i];}}
//  for (int i=1;i<=n;i++)
//      for (auto k:e[i]) cout<<k.fi<<" "<<i<<":"<<k.se<<endl;f[0][0]=2;for (int i=1;i<=n;i++){for (int j=0;j<=i-1;j++) f[i][1]=upd(f[i][1],f[i-1][j]);for (auto k:e[i]) if (k.fi==i) f[i][1]=1ll*f[i][1]*quick_pow(2,k.se)%mods;for (int j=2;j<=i;j++){f[i][j]=upd(f[i][j],f[i-1][j-1]);for (auto k:e[i])if (k.fi>=i-j+1) f[i][j]=1ll*f[i][j]*quick_pow(2,k.se)%mods;}
//      cout<<i<<":";
//      ll sum=0;
//      for (int j=0;j<=i;j++) cout<<f[i][j]<<" ",sum+=f[i][j];
//      cout<<sum<<endl;}int ans=0;for (int i=1;i<=n;i++) ans=upd(ans,f[n][i]);printf("%d\n",ans);return 0;
}

[AGC026D]Histogram Coloring相关推荐

  1. AtCoder Grand Contest #026 D - Histogram Coloring

    Time Limit: 2 sec / Memory Limit: 1024 MB Score : 11001100 points Problem Statement Let us consider ...

  2. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  3. CUDA Samples: Calculate Histogram(atomicAdd)

    以下CUDA sample是分别用C++和CUDA实现的计算一维直方图,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程CUDA实战>一书的第九章,各个文件内容如下 ...

  4. zw版【转发·台湾nvp系列Delphi例程】HALCON Histogram

    zw版[转发·台湾nvp系列Delphi例程]HALCON Histogram unit Unit1; interface uses Windows, Messages, SysUtils, Vari ...

  5. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘直方图、自定义边缘直方图的色彩(Marginal Histogram)

    Python使用matplotlib可视化散点图.并在可视化图像的底部和右边添加边缘直方图.自定义边缘直方图的色彩(Marginal Histogram) 目录

  6. python使用matplotlib可视化3D柱状图(3D histogram、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为z、改变3d图观察的角度

    python使用matplotlib可视化3D柱状图(3D histogram.三维柱状图.包含三个坐标轴x.y.z).设置zdir参数为z.改变3d图观察的角度 目录

  7. R语言ggplot2可视化散点图(scatter plot)、并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram)、使用geom_smooth函数基于lm方法拟合数据点之间

    R语言ggplot2可视化散点图(scatter plot).并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram).使用geom_smooth函数基于lm方法拟合数据点之间 ...

  8. R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)

    R语言单变量分析实战:汇总统计(Summary Statistics).频率表(Frequency Table).图表(charts: boxplot.histogram.density) 目录

  9. python使用matplotlib可视化3D直方图(3D histogram、三维直方图、包含三个坐标轴x、y、z)、3D直方图可视化多个维度数据的区别和联系

    python使用matplotlib可视化3D直方图(3D histogram.三维直方图.包含三个坐标轴x.y.z).3D直方图可视化多个维度数据的区别和联系 目录

最新文章

  1. ASP导出EXCEL乱码?试试这个
  2. Spring data jpa 条件查询-按时间段查询
  3. 超越ImageNet预训练,Meta AI提出SplitMask,小数据集也能自监督预训练
  4. Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
  5. 实验4 [bx]和loop的使用
  6. mysql创建表时表明加单引号_python在MySQL表名周围插入单引号(‘)
  7. java default修饰符_Java学习笔记--- 变量类型,修饰符
  8. 正则匹配字符串无匹配不到_10. 正则表达式匹配
  9. 软考论文案例-论微服务架构及其应用
  10. snmpwalk工具使用
  11. python chardet库的函数用法
  12. html的空心箭头,CSS实现空心三角指示箭头
  13. C. Multiples of Length 思维构造
  14. WIN10 困扰多时的屏幕亮度 终于可以调节了-完美 -更新2018年2月28日
  15. 圆锥形怎么画_(艺考生必看)素描圆锥体怎么画?详解过程,想提高成绩的进来!...
  16. 影视广告创意与制作(二)
  17. 用python写银行叫号系统(这个是学校的实训题目,真的没什么技术含量)
  18. ip route 命令的作用详解
  19. 有效沟通bic法则_销售员的黄金法则,ABC三角沟通法则,借力使力不费力,附PPT...
  20. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.8 侧光拍摄增强轮廓感

热门文章

  1. 全球顶级大学,在中国录取率却不足0.5%,答案一针见血!
  2. 女生心中的理想男生!这些条件你符合几条?
  3. 大牛逝世 = 新人上位 = 科学进步?新研究表明确实如此
  4. 年底求职难?起薪28万的数据岗位,人才缺口达150万,不限专业学历……
  5. 有趣!机器学习预测《守望先锋》里的赢家
  6. c语言时间算法如何以毫秒显示,C语言时间的方法.doc
  7. c语言函数调用二次方程求根,[编程入门]自定义函数求一元二次方程 (C语言代码)...
  8. Java连续获取两个输入,java 获取控制台的输入的两个方法
  9. python数据分析numpy_(转)Python数据分析之numpy学习
  10. 数据结构 - 单调栈、单调队列