[AGC026D]Histogram Coloring

[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][ij+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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日训练赛

文章目录说明2021.9.242021.9.252021.9.262021.9.272021.9.282021.9.292021.9.302021.10.12021.10.22021.10.32021.10.42021.10.52021.10.62021.10.72021.10.82021.10.92021.10.132021.10.152021.10.162021.10.212021.10.222021.10.242021.10.252021.10.262021.10.29说明 记录…

读《代码整洁之道》

什么是整洁代码代码的质量非常重要&#xff0c;糟糕的代码有可能会毁了一个公司。对于一个很注重代码质量的人来说呆在一个只关注交付而不关注代码质量的公司是很痛苦的。什么是整洁的代码&#xff0c;不同的人又不同的定义。我认为整洁的代码应该是符合所使用语言代码规范的&a…

[ZJOI2016]小星星

[ZJOI2016]小星星 题目描述 luogu题面 给定一个n个点的树和n个点m条边的无向图&#xff0c;求将树嵌入图的方案数。 其中 n≤17,m≤n∗(n−1)2n \leq 17,m \leq \frac{n*(n-1)}{2}n≤17,m≤2n∗(n−1)​。 Solution 点数很少&#xff0c;考虑状压DP。 令f[i][j][k]f[i][j]…

在 DotNetty 中实现同步请求

一、背景DotNetty 本身是一个优秀的网络通讯框架&#xff0c;不过它是基于异步事件驱动来处理另一端的响应&#xff0c;需要在单独的 Handler 去处理相应的返回结果。而在我们的实际使用当中&#xff0c;尤其是 客户端程序 基本都是 请求-响应 模型&#xff0c;在发送了数据时候…

BZOJ#3252. 攻略

BZOJ#3252. 攻略 题目描述 Solution 有一个显然的 贪心&#xff0c;每次选取一个到根的点权和最大的点xxx&#xff0c;将答案加上xxx到根的路径的点权和&#xff0c;并将xxx到根的路径上的点的权值清零。 可以使用DFS序线段树维护。 但完全没有这么麻烦。 容易发现每一次选…

ASP.NET Core 中间件

1.前言中间件&#xff08;middleware&#xff09;是一种装配到应用管道以处理请求和响应的组件。每个组件&#xff1a;●可选择是否将请求传递到管道中的下一个组件。●可在管道中的下一个组件前后执行工作。请求委托&#xff08;request delegates&#xff09;用于建立请求管道…

P3899 [湖南集训]谈笑风生

P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问&#xff0c;将询问放在相对应的子树ppp中计算答案。 显然a,b,ca,b,ca,b,c的位置关系有两种情况&#xff1a; bbb是aaa的祖先&#xff0c;ccc是aaa的子孙。aaa是bbb的祖先&#xff0c;ccc是bbb的子孙。 第一种…

.Net Core实现的文档数据库RavenDb

说到文档数据库&#xff0c;大家能想到很多&#xff0c;MongoDb,coudDb。如果只是文档的话&#xff0c;甚至可以使用对象存储&#xff0c;阿里的oss&#xff0c;腾讯cos。但是这里小编选择这RavenDb&#xff0c;原因是对象存储下行太贵了(来自穷逼的绝望)。MongoDb据说非常占用…

bzoj4543. [POI2014]Hotel加强版

bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做。 考虑树形dpdpdp。 设f[i][j]f[i][j]f[i][j]表示以iii为根的子树中&#xff0c;深度为jjj的结点个数。 设g[i][j]g[i][j]g[i][j]表示以iii为根的子树中的二元组(x,y)(x,y)(x,y)数量&a…

Web Template Studio 发布!在 VS Code 中轻松创建 Web 应用

作为一个 Web 应用开发者&#xff0c;Scaffolding Tool&#xff08;脚手架工具&#xff09;一定是在创建项目时的重要工具。许多开发者会习惯于使用基于 CLI 的脚手架工具来创建 Web 应用&#xff0c;也有许多开发者喜欢使用类似于 VS IDE 的基于 UI 的 Wizard 向导。近期&…

AGC022E - Median Replace

AGC022E - Median Replace 题面描述 Solution 直接构造自动机&#xff0c;模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state]&#xff0c;状态很少&#xff0c;直接打表转移即可。 时间复杂度O(n)O(n)O(n)。 #include <vector> #include <lis…

再多迷茫,不如静下来好好学习

背景前不久&#xff0c;我有幸看到了CSDN知名博主“沉默王二”写的一篇博客《你的青春&#xff0c;值得先给小型创业公司吗&#xff1f;》&#xff0c;这篇博客介绍了他从苏州回到内地小城洛阳之后&#xff0c;虽然远离了互联网的主阵地&#xff0c;但是依然保持学习的态度&…

AGC023D - Go Home

AGC023D - Go Home 题目描述 Solution 我们首先把这些人分成在sss左边和在sss右边两类&#xff0c;考虑最左边的一群人AAA和最右边的一群人BBB&#xff0c;这两群人中必然有其中一群人是最后到家的。而是否最后到家取决于这两群人的人数&#xff08;因为倘若只剩下两群人&am…

Web API 速率限制(二)- 令牌桶算法简介

前情提要上一篇文章里简单介绍了什么是Web API的速率限制&#xff0c;和限速策略需考虑的问题&#xff0c;最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。实施策略如果你想要建立一个限速系统&#xff0c;首先要确保限速系统不会增加API的响应时间。为了保证…

AGC023F - 01 on Tree

AGC023F - 01 on Tree 题目描述 Solution 有一个奇妙的贪心思路。&#xff08;奇妙的原因是我不会证&#xff09; 这一题的结点需要按拓扑序排序&#xff0c;并让逆序对个数最小。 考虑在儿子向父亲合并的过程中统计答案&#xff0c;产生的逆序对个数就是cnt[father][1]∗cn…

让 Ocelot 与 asp.net core “共存”

Intro我们的 API 之前是一个单体应用&#xff0c;各个模块的服务是通过 Assembly 集成在一起&#xff0c;最后部署在一个 web server 下的。我们已经在拆分服务并且在 Ocelot 的基础上封装了我们自己的网关&#xff0c;但是服务还没有完全拆分&#xff0c;于是有这么一个需求&a…

AGC024E - Sequence Growing Hard

AGC024E - Sequence Growing Hard 题目描述 Solution 我们可以把问题看成如下形式&#xff1a; 你有一个空序列&#xff0c;每次要加入一个元素xxx,x∈[1,k]x \in [1,k]x∈[1,k]&#xff0c;使得新的序列字典序比上一个序列的字典序大。 显然如果我们加入一个数xxx&#xf…

Xamarin中国峰会2019

Xamarin跨平台技术中国峰会将讨论Xamarin技术的国内最新发展和实践情况&#xff0c;在会议中领略现代化的开发模式、应用基础架构、企业应用转型和案例交流。本月26日&#xff0c;Xamarin中国峰会将以线上直播的形式和大家见面&#xff01;直播时间:2019年5月26日 8:00—17:00直…

博弈论练习1

博弈论练习1 \;1.ProjectEuler306 Paper-strip Game 题目描述 Solution 令SG[i]SG[i]SG[i]表示连续iii个格子的SGSGSG值。 SG[0]SG[1]0SG[i]mexj0n−2{SG[j]xorSG[i−j−2]}SG[0]SG[1]0 \\ SG[i]mex_{j0}^{n-2}\{SG[j]\;\;xor\;\;SG[i-j-2]\} SG[0]SG[1]0SG[i]mexj0n−2​{S…

.NET Core IoT 入门指南:(三)使用 I2C 进行通信

什么是 I2C 总线I2C 总线&#xff08;Inter-Integrated Circuit Bus&#xff09;是设备与设备间通信方式的一种。它是一种串行通信总线&#xff0c;由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线&#xff0c;一根…