题目链接:http://uoj.ac/problem/238

题目大意:

有一个长度为n的黑白序列,告诉你所以k个极长连续黑段长度和顺序。有一些位置的颜色已知,需要判断剩下未知的位置哪

些颜色

一定是白或一定是黑。保证至少存在一组解。


分析:

先猜测,根据数据范围,虽然n很大,但是k却很小,可以考虑复杂度为O(n*k)的算法。(* ̄︶ ̄)

我们再来具体看看,可以设状态:

f0[i][j] 表示前i个位置能匹配j段并且i位置为白是否合法。

f1[i][j] 表示前i个位置能匹配j段并且i位置为黑是否合法,可以O(n*k)求出。

但这样却又漏洞,我们只是保证了从前往后i,j合法,但是我们还不能保证在这种情况满足后面i+1到n-1是否合法,大概就是我们不能保证

剩下的位置够不够。

为了解决这个问题我们再定义两个状态,g0[i][j],g1[i][j]从后往前来记录。

这样状态转移就是:

if(a[i]!=X) f[i][j][0]=f[i-1][j][0]|f[i-1][j][1] (可以与前面一个组成一组,也可以接在一个黑色后面,有一种满足都合法)

if(i-b[j]>=0&&sum[i]-sum[i-b[j]]==0)f[i][j][1]=f[i-b[j]][j-1][0];(在i-b[j]+1-i直接没有X&&i-b[j]位置为白)

g的转移一样,只是从后往前处理。


答案:

如果f[i][j][0]==1&&g[i][j+1][0](表示从前往后第i个位置满足j段并且当前为白色时合法&&从i到n-1满足j+1到m段的块,并且当前

为白色合法)

两个都合法说明i就可以为白色,用y记录是否为白色。

如果f[i][j][1]==1&&g[i+1][j+1][0](上面类似,当前为黑,那么下一位就要为白)

两个都合法说明i就可以为黑色,用个x记录一个数能为黑色的数量,如果最后x>0说明可以为黑色。


统计:

如果y[i]&&x[i],两个都可以输出?,其他x,y输出即可。


附上交互代码:

//g为从后往前 f为从前往后 是否合法
#include "paint.h"
#include<bits/stdc++.h>
using namespace std; const int N=2e5+;
const int K=;
bool g[N][K][],f[N][K][];//第i位 满足j段 并现在为0/1 白/黑
int x[N],y[N],last;
int tag[N];
char a[N];int b[N],sum1[N],sum2[N];
string res;
string solve_puzzle(std::string s, std::vector<int> c)
{
int n=s.length(),m=c.size();
for(int i=;i<=n;i++) a[i]=s[i-],sum1[i]+=sum1[i-]+(a[i]=='X'),sum2[i]+=sum2[i-]+(a[i]=='_');
for(int i=;i<=m;i++) b[i]=c[i-];
g[n+][m+][]=;
for(int i=n;i>=;i--)
{
for(int j=m+;j>=;j--)
{
if(a[i]^'X') g[i][j][]=g[i+][j][]|g[i+][j][];
if(j!=m+&&n-i+>=b[j]&&sum2[i+b[j]-]-sum2[i-]==) g[i][j][]=g[i+b[j]][j+][];
}
}
f[][][]=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(a[i]!='X') f[i][j][]=f[i-][j][]|f[i-][j][];
if(j&&i>=b[j]&&sum2[i]-sum2[i-b[j]]==) f[i][j][]=f[i-b[j]][j-][];
if(f[i][j][]&&g[i][j+][]) y[i]=;
if(f[i][j][]&&g[i+][j+][]) x[i-b[j]+]++,x[i+]--;
}
}
for(int i=;i<=n;i++)
{
x[i]+=x[i-];
if(a[i]=='.')
{
if(x[i]&&y[i]) res+='?';
else if(x[i]) res+='X';
else res+='_';
}else res+=a[i];
}
return res;
}

转载请声明!!!


IOI2016Day2. paint的更多相关文章

  1. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...

  2. android Canvas 和 Paint用法

    自定义view里面的onDraw方法,在这里我们可以绘制各种图形,onDraw里面有两个API我们需要了解清楚他们的用法:Canvas 和 Paint. Canvas翻译成中文就是画布的意思,Canv ...

  3. [LeetCode] Paint Fence 粉刷篱笆

    There is a fence with n posts, each post can be painted with one of the k colors. You have to paint ...

  4. [LeetCode] Paint House II 粉刷房子之二

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  5. [LeetCode] Paint House 粉刷房子

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...

  6. xp系统重绘边框线不显示(首次加载没有触发paint事件)

    同样是,重绘边框事件,win7系统显示正常,而xp系统却不显示,这是什么原因造成的呢? 于是,小编开始百度,不停的查找原因,通过一番查找,小编也意外的收获了一些内容: 例如:窗口的拖动,放大,缩小,等 ...

  7. LeetCode Paint House II

    原题链接在这里:https://leetcode.com/problems/paint-house-ii/ 题目: There are a row of n houses, each house ca ...

  8. LeetCode Paint House

    原题链接在这里:https://leetcode.com/problems/paint-house/ 题目: There are a row of n houses, each house can b ...

  9. zjuoj 3773 Paint the Grid

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3773 Paint the Grid Time Limit: 2 Secon ...

随机推荐

  1. j2ee基础(1)servlet的生命周期

    Servlet的生命周期 Servlet 生命周期规定了 Servlet 如何被加载.实例化.初始化. 处理客户端请求,以及何时结束服务. 该生命周期可以通过 javax.servlet.Servle ...

  2. [BZOJ4011][HNOI2015] 落忆枫音(学习笔记) - 拓扑+DP

    其实就是贴一下防止自己忘了,毕竟看了题解才做出来 Orz PoPoQQQ 原文链接 Description 背景太长了 给定一个DAG,和一对点(x, y), 在DAG中由x到y连一条有向边,求生成树 ...

  3. SourceTree 03 - 跳过账号登录直接进入主界面

    SourceTree系列第1篇 SourceTree 01 - git 客户端介绍(http://www.cnblogs.com/geaosu/p/8807666.html) SourceTree系列 ...

  4. 什么是web框架

    什么是web框架 web应用框架是支持动态网站.网络应用程序的软件框架. web框架的工作方式:接收http请求并处理,分派代码, 产生html,创建http响应. web框架 通常包含了:url路由 ...

  5. Node.js系列文章:如何进行代码调试

    使用任何一门编程语言,都少不了代码调试这一功能.我们在使用JavaScript编写浏览器端代码时,Chrome提供了强大的调试工具Dev Tools,但是在编写Node.js代码时,大多数人最开始都使 ...

  6. [LeetCode] K-diff Pairs in an Array 数组中差为K的数对

    Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in t ...

  7. 3.如何搭建Appium自动化测试环境

    整个APP自动化环境安装可以参照虫师博客安装 附以下链接: http://www.cnblogs.com/fnng/category/695788.html 下面介绍运用到工作中遇到的一些问题 1.如 ...

  8. vue 2.0 路由切换以及组件缓存源代码重点难点分析

    摘要 关于vue 2.0源代码分析,已经有不少文档分析功能代码段比如watcher,history,vnode等,但没有一个是分析重点难点的,没有一个是分析大命题的,比如执行router.push之后 ...

  9. 实验吧_程序逻辑问题(代码审计)&上传绕过

    一开始我先随便输入了几个账号名字进行测试,发现当输入的账号名为admin时会发生报错 经过测试果然是一个注入点 当拿到admin密码后发现根本没用,没办法另寻他路 审查元素时发现提示index.txt ...

  10. 是否有必要学习使用纯Verilog写一个SDRAM控制器

    在做这个SDRAM控制器之前,博主有一个疑问,对于学生来说,是否有必要学习用纯Verilog写一个SDRAM控制器?因为目前X家和A家都有了DDR IP Core,对于要实现一个应用可以直接调用IP ...