zoukankan      html  css  js  c++  java
  • Codeforces Round #639 (Div. 2)

    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;
    }
  • 相关阅读:
    leetCode 116.Populating Next Right Pointers in Each Node (为节点填充右指针) 解题思路和方法
    最终考过了驾照考试,如今就=驾照下来了
    JSON.parseObject的几种用法
    mybatisplus构造器 condition
    MyBatis中jdbcType=INTEGER、VARCHAR作用
    mybatis动态sql
    数据库表可以没有外键
    msyql的子查询,或者叫嵌套查询
    mysql 的编写顺序和执行顺序
    StringUtils的isBlank()方法
  • 原文地址:https://www.cnblogs.com/et3-tsy/p/12843693.html
Copyright © 2011-2022 走看看