CF991D Bishwock

题目描述

给一个\(2\times n\)的网格,上面一些位置以及被覆盖上了。现在你有一种形状为L的小块,每个由三个小格组成,构成L型

现在问你,当前的网格最多还能摆多少小块(不能覆盖以及覆盖过的格子)

输入格式

两行两个字符串由\(X,0\)组成,\(X\)表示被覆盖了,\(0\)表示还没有

输出格式

一行 一个整数

样例输入

00X00X0XXX0
0XXX0X00X00

样例输出

4

对于\(100\)%的数据满足\(n\le 10^5\)

题目分析

​ 大约一年前的模拟赛上似乎就出过这道题。(考试后证明我是对的......) 至于为什么要更这篇题解,因为今年差点没切(去年都切了.... 其实最后今年也没切,数组开小了)

​ 个人想法就不说了,乱七八糟想了一堆,一个没搞出来。周围大佬们都切了,就先去看T2了(事实证明是正确的,如果T1切掉也就不会那么认真的去考虑T2)。

​ 闲话少叙,步入正题。

​ 首先我们观察一下数据范围....(然鹅并没有什么用) 突破口是在\(2\times n\)的矩阵,以及只有一种L型的块块。 所以,对于一个\(2\times 2\)的矩阵,合法情况是一定的。具体几种长什么样可以手画一下。

​ 所以我们想到一种类似递推的更新方式。 预处理出来每列的状态:

​ \(f[i][1/2/3/4]\)分别表示每列的一种可能更新的状态。

​ \(f[i][1]\) \(XX\) \(f[i][2]\) \(0X\) \(f[i][3]\)$ X0 $ \(f[i][4]\) \(00\)

​ \(f[i][0]\)用来记录当前列的答案。

​ 然后就是一堆特判。 注意对于每列更新完之后,\(f[i][2/3]\)这两种情况需要清零,而\(f[i-1][4]=1\)且\(f[i][4]=1\)时,\(f[i][4]\)只会被用到一次,所以可以拆成\(f[i][2/3] = 1\)以便接下来的操作。具体实现见代码。

​ code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100020;
int f[N][5];
char str[3][N];
int main()
{
// freopen("a.in", "r", stdin);
// freopen("a.out", "w", stdout);
scanf("%s", str[1] + 1);
scanf("%s", str[2] + 1);
int n = strlen(str[1] + 1);
memset(f, -1, sizeof f);
for(int i = 1 ; i <= n ; i ++)
f[i][0] = 0;
for(int j = 1 ; j <= n ; j ++)
{
if(str[1][j] == '0' && str[2][j] == '0')
f[j][4] = 1;
else
if(str[1][j] == '0' && str[2][j] == 'X')
f[j][3] = 1;
else
if(str[1][j] == 'X' && str[2][j] == '0')
f[j][2] = 1;
else
if(str[1][j] == 'X' && str[2][j] == 'X')
f[j][1] = 1;
}
for(int i = 2 ; i <= n ; i ++)
{
if(f[i - 1][4] == 1 && f[i][4] == 1)
{
f[i][0] ++;
f[i][2] = 1;
f[i][3] = 1;
f[i][4] = 0;
}
else
if(f[i - 1][2] == 1 && f[i][4] == 1)
{
f[i][0] ++;
f[i][4] = 0;
}
else
if(f[i - 1][3] == 1 && f[i][4] == 1)
{
f[i][0] ++;
f[i][4] = 0;
}
else
if(f[i - 1][4] == 1 && f[i][3] == 1)
{
f[i][0] ++;
f[i][3] = 0;
}
else
if(f[i - 1][4] == 1 && f[i][2] == 1)
{
f[i][0] ++;
f[i][2] = 0;
}
}
int ans = 0;
for(int i = 1 ; i <= n ; i ++)
ans += f[i][0];
printf("%d", ans);
fclose(stdin);
fclose(stdout);
return 0;
}

CF991D Bishwock的更多相关文章

  1. CF991D Bishwock 第十七 贪心

    Bishwock time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  2. [CF991D]Bishwock_状压dp

    Bishwock 题目链接:http://codeforces.com/problemset/problem/991/D 数据范围:略. 题解: 一眼题. 首先,每个$L$最多只占用两列,而且行数特别 ...

  3. 【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)

    题目 传送门:QWQ A:A - If at first you don't succeed... 分析: 按照题意模拟 代码: #include <bits/stdc++.h> usin ...

  4. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  5. Codeforces Round #491 (Div. 2)部分题解

    这场比赛好鬼畜啊,,A题写崩了wa了4遍,心态直接爆炸,本来想弃疗了,结果发现BCD都是傻逼题.. A. If at first you don't succeed...(容斥原理) 题目大意: 有$ ...

随机推荐

  1. Cookie的有效路径

    程序实现: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletE ...

  2. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

  3. 首次GitHub千星项目提交维护成功 留念

    现在有点激动,可能有混乱的地方.请大家见谅. 一直觉得千星项目,对我来说是一个遥不可及的地方.没想到第一次在GitHub上 提交Pull Request 就成功了,并且是一个千星项目. 虽然 只是提出 ...

  4. QTP8.2--安装流程

    一.安装说明: 1.进入安装文件夹,运行QTP8.2安装文件setup,进入安装向导后直接单击“QuickTest Professional 安装”选项,由于破解文件存在缺陷,所以请不要改变安装路径c ...

  5. selenium自动化测试-浏览器基本操作

    webdriver 通过协议和接口发现DOM中的元素,并实现控制浏览器的行为,例如打开浏览器.控制浏览器大小. 浏览器刷新及浏览器前进.后退等,接下来介绍浏览器的一些基本操作. 1.启动浏览器 dri ...

  6. KD-tree学习笔记(超全!)

    目录 K-D树 更新信息 建树 插入 查询 k远/近询问 重构 K-D 树优化建边 后记 因为之前找不到全的博客,唯一的一篇码风比较毒瘤... 所以我就来写了 K-D树 大概是高维二叉树吧 每次按一个 ...

  7. redis常用笔记(第一版)

    1.SINTER 说明:多key之间取交集数据 key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SINTER key1 key2 key3 = {c} 2.sad ...

  8. 如何配置VMware客户虚拟机使用NAT模式联网通信

    本例中配置客户虚拟机(CentOS)使用NAT(网络地址转换Network Address Translation)模式进行联网到公网(互联网).客户机网段为192.168.1.0/24网段,经NAT ...

  9. golang的生产者消费者模型示例

    package main import "fmt" func Producer(ch chan int) { for i := 1; i <= 10; i++ { ch &l ...

  10. iOS 设备数据管理工具 iMazing v2.10.3 绿色便携版

    iMazing 是一款可以帮助用户管理 iOS 设备的软件,功能远远超出 iTunes.iMazing 连接你的 iOS 设备(iPhone. iPad 或 iPod)相连,使用起来也非常的方便.你可 ...