CF991D Bishwock
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的更多相关文章
- CF991D Bishwock 第十七 贪心
Bishwock time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- [CF991D]Bishwock_状压dp
Bishwock 题目链接:http://codeforces.com/problemset/problem/991/D 数据范围:略. 题解: 一眼题. 首先,每个$L$最多只占用两列,而且行数特别 ...
- 【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)
题目 传送门:QWQ A:A - If at first you don't succeed... 分析: 按照题意模拟 代码: #include <bits/stdc++.h> usin ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- Codeforces Round #491 (Div. 2)部分题解
这场比赛好鬼畜啊,,A题写崩了wa了4遍,心态直接爆炸,本来想弃疗了,结果发现BCD都是傻逼题.. A. If at first you don't succeed...(容斥原理) 题目大意: 有$ ...
随机推荐
- Redis压缩包win10快速启动之记录一
转载请标明出处: http://dujinyang.blog.csdn.net/ 本文出自:[奥特曼超人的博客] Redis压缩包 配置环境变量,直接CMD中启动,默认是打开redis.conf,当然 ...
- CentOS7 安装 Pure-ftpd
博客地址:http://www.moonxy.com 一.摘要 FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议”.用于Intern ...
- Bean 装配,从 Spring 到 Spring Boot
目录 从SSM的集成谈到Bean的装配 Bean的装配 由XML到Java Config 自动扫描 Bean的注入 SSM集成的Java版 Spring Boot Magic Auto Confi ...
- 【linux】【FastDFS】FastDFS安装
前言 FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存 ...
- 安装vue开发环境
每次搜索vue开发环境安装时,总是有很多种版本,虽然都能安装完成,但还是整理下自己觉得比较好的版本吧 1.首先安装nodeJs以及也把git安装好(反正开发也是需要git),安装完成后执行 node ...
- wpf 使用矢量字体 fontawesome
第一步:首先下载矢量字体 :http://www.fontawesome.com.cn/ 第二步:在将fontawesome-webfont.ttf 文件引用到项目 设置fontawesome-web ...
- 构建之法——homework1:问题思考
1.我看了第一章概论,1.2.4 软件工程的目标——创造“足够好”的软件,其中提到了什么是好的软件? 软件工程的一个要素就是把软件的Bug都消灭掉的过程. 提问:我们知道Bug是不可能完全消灭掉的, ...
- Spring Data JPA 梳理 - 使用方法
1.下载需要的包. 需要先 下载Spring Data JPA 的发布包(需要同时下载 Spring Data Commons 和 Spring Data JPA 两个发布包,Commons 是 Sp ...
- 记录使用echarts的graph类型绘制流程图全过程(一)-x,y位置的计算
先说下本次案例业务需求,输入2个节点,获取数据后绘制出2个节点间的路径,之前使用的是网状图,但是网状图的效果不佳,需要转换成流程图的模式: 那么如何在不修改数据的情况下,实现类似效果尼? 看了下ech ...
- ELK 学习笔记之 elasticsearch Bulk操作
Bulk操作: Bulk操作用于批量插入数据: 请求体格式: 编辑一个文件:(插入2个新的文档) curl -XPOST 'http://192.168.1.151:9200/library/book ...