Codeforces Round #639 (Div. 2)

(这场官方搞事,唉,just solve for fun...)

A找规律

给定n*m个拼图块,每个拼图块三凸一凹,问能不能拼成 n * m的长方形

只要有某一维为1都可,只要无一维为1,只能是 2 * 2

B找规律,二分

搭金字塔

如图:

给定n,每次尽可能搭高的,问能搭几个金字塔

找规律,预处理,查询时二分

C数学,桶

换房子,下面就是换的规则(无非就是新房为k+Ak再对n取模)

模拟一下,桶存即可

D深搜

规则很多很复杂

原题地址:

https://codeforces.ml/contest/1345/problem/D

主要的构造要求

思路:整理一下所有题目背景,发现我们为了满足规则2,不妨先在所有黑格子上放S即可,然后再考虑如何放N,这样很轻易实现规则2

先讲一下针对规则3非法情况

所有的黑格子形成的区域块一定是一个凸块

如果是凹块(包括中空和边缘缺失的情况)一定会破坏规则3

因为数据比较小,所以我们暴力去查是否满足凸块,即一旦一行或者一列出现了黑块,那么这个黑块只能连续,否则肯定非法

再考虑一下规则1如何非法

根据前面的逻辑,我们S只放在黑色块上,那么只要一行或一列全为白,那就破坏了规则1

但真的是这样吗?

这里真的很坑,按照前面的思路,我们只是将所有黑格上放S,不意味着白格不能放S

如果说一行全白并且一列全白,那么他们的交点如果我放S,那么规则1就不会被破坏了

所以这一点一定要注意,否则很多可行解会被遗漏

一旦满足了所有要求,那么我们最少应该放多少S嘞?

显然一个凸块给一个S,让S该凸块纵情遨游即可

所以dfs深搜,记录访问情况即可

AC:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 1005
#define minn -105
#define ll long long int
#define ull unsigned long long int
#define uint unsigned int
inline int read()
{
int ans=0;
char last=' ',ch=getchar();
while(ch<'0'|ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
char a[maxn][maxn];
bool been[maxn][maxn];
int n,m;
bool ok=0;
void dfs(int x,int y)
{
if(x<1||y<1||x>n||y>m||a[x][y]=='.'||been[x][y])return;
been[x][y]=1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
}
int main()
{
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
been[i][j]=0;
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
bool check1=0,check2=0;
int k=0;
for(int i=1;i<=n;i++)
{
if(ok)break;
check2=0;
for(int j=1;j<=m;j++)
{
if(a[i][j]=='.'||ok)continue;
if(check2)ok=1;
check2=1;
while(j<=m&&a[i][j]=='#')j++;
}
if(!check2)check1=1;
}
bool check3=0,check4=0;
for(int i=1;i<=m;i++)
{
if(ok)break;
check4=0;
for(int j=1;j<=n;j++)
{
if(a[j][i]=='.'||ok)continue;
if(check4)ok=1;
check4=1;
while(j<=n&&a[j][i]=='#')j++;
}
if(!check4)check3=1;
}
if(check3!=check1)ok=1;
if(ok)
{
cout<<-1<<endl;
return 0;
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ok)break;
if(been[i][j]||a[i][j]=='.')continue;
ans++;
dfs(i,j);
}
cout<<ans<<endl;
return 0;
}

Codeforces Round #639 (Div. 2)的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

随机推荐

  1. JVM崩溃的原因及解决!

    JVM崩溃的原因及解决! 前些天,搞JNI的时候,报了个JVM崩溃的错.错误信息如下: # # An unexpected error has been detected by HotSpot Vir ...

  2. 一个不错的博客-涉及el 、jstl、log4j 入门等

    http://www.cnblogs.com/Fskjb/category/198224.html

  3. 第一章:shell脚本初入门

    1.shell脚本中的source或者.空格再加上文件,表示加载文件中的命令及语句(困惑多时终于解开^-^) 2.脚本开头书写好作者版本等信息,方便维护:流程语句提前把格式写好,防止遗漏 3.定义字符 ...

  4. I - Red and Black DFS

    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...

  5. 常用ElasticSearch 查询语句

    为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布 ...

  6. 好用的mitmproxy代理抓包

    安装证书 浏览器输入 `mitm.it` 下载证书有时候打不开,可能是起的服务卡死了,回车下命令行,再再网页刷新下载证书就可以了. mitmweb Chrome浏览器代理设置 打开的话,记得保存点一下 ...

  7. 如何用TensorFlow实现线性回归

    环境Anaconda 废话不多说,关键看代码 import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' tf.a ...

  8. spark中的pair rdd,看这一篇就够了

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第四篇文章,我们一起来看下Pair RDD. 定义 在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基 ...

  9. ES6让字符串String增加了哪些好玩的特性呢?

    确实因为现在天气变热了,所以一天天的这么写我也很累.所以如果阅读的时候有什么错误还请大家指出来,不好意思.学习永无止境. OK,今天继续讲解ES6系列知识 学过上一节的解构赋值就知道,ES6确实给我们 ...

  10. 支持向量机SVM知识梳理和在sklearn库中的应用

    SVM发展史 线性SVM=线性分类器+最大间隔 间隔(margin):边界的活动范围.The margin of a linear classifier is defined as the width ...