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. 八、路由详细介绍之动态路由OSPF(重点)

    一.OSPF介绍 OSPF优点:无环路.收敛快.扩展性好.支持认证 二.工作原理: 图中RTA.RTB.RTC每个路由器都会生成一个LSA, 通过LSA泛洪进行互相发送相互学习,形成LSDB (链路状 ...

  2. SpringMVC框架详细教程(二)

    创建动态Web项目 1.创建动态Web项目: 打开Eclipse,在Package Explorer右击,创建项目,选择动态Web项目(Dynamic Web Project). 填写项目名称,并选择 ...

  3. 数据结构和算法(Golang实现)(20)排序算法-选择排序

    选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...

  4. break与continue用法注意事项

    break 中断循环执行,跳出循环 注意,break只能中断自己所在的循环,一般用在内层循环,但是不能中断外层循环中的代码. continue 跳到循环的下一轮继续执行,结束自己所在循环体代码,继续自 ...

  5. C++_编程前奏

    计算机硬件系统 计算机操作系统的五大组成部分 计算机操作系统的组成部分 构成 控制器 指令寄存器(IR)/程序计数器(PC)/操作控制器(OC) 运算器 算数逻辑单元/累加器/状态寄存器/通用寄存器 ...

  6. Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 前面介绍了两种allure的 ...

  7. bootstrap-table 内容超出鼠标悬浮显示全部

    .table th, .table td { text-align: center; vertical-align: middle !important; } table { width: 100px ...

  8. 学习Salesforce | Einstein业务机会评分怎么玩

    Einstein 业务机会评分(Opportunity Scoring)是销售团队的得力助手,通过分数以及研究影响分数的因素,确定业务机会的优先级,赢得更多交易. Einstein 业务机会评分可以给 ...

  9. 如何可视化深度学习网络中Attention层

    前言 在训练深度学习模型时,常想一窥网络结构中的attention层权重分布,观察序列输入的哪些词或者词组合是网络比较care的.在小论文中主要研究了关于词性POS对输入序列的注意力机制.同时对比实验 ...

  10. 关于Python+selenium 定位浏览器弹窗元素

    首先要确定弹窗的类型: (1)div弹窗 (2)新标签页弹窗 (3)alert弹窗 一,div弹窗div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样.不过这里会有一个坑,明明可以找到这个 ...