zoukankan      html  css  js  c++  java
  • Codeforces 1196E. Connected Component on a Chessboard

    传送门

    注意到棋盘可以看成无限大的,那么只要考虑如何构造一个尽可能合法的情况

    不妨假设需要的白色格子比黑色格子少

    那么容易发现最好的情况之一就是白色排一排然后中间黑的先连起来,剩下黑色的再全部填白色周围

    可以证明如果需要 $w$ 个白色格子,那么黑色格子的数量不能超过 $3w+1$

    证明:首先 $w=1$ 时显然

    然后考虑下一个白色格子扩展,显然从一边延伸出去,然后又多了 $3$ 个可以放黑色的位置,这样一路扩展显然可以放 $3w+1$ 个黑色的位置

    然后考虑证明没有更好的方案,显然除了第一次白色可以提供四个黑色位置以外,之后放扩展白色时,至少要有其中一边和原本的黑色相邻,那么每次扩展多就只能多 $3$ 个合法位置

    证明完毕

    然后直接按构造的搞就行了,注意一下细节就行

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    int Q,b,w;
    inline bool pd(int x,int y) { return (x+y)&1; }
    int main()
    {
        Q=read();
        while(Q--)
        {
            b=read(),w=read();
            if(b>3*w+1||w>3*b+1) { printf("NO
    "); continue; }
            printf("YES
    "); int px,py,l;
            if(w>=b) px=py=2;
            else px=2,py=3;
            l=py;
            while(w||b)
            {
                if(pd(px,py))
                {
                    if(!b) { py--; break; }
                    b--;
                }
                else
                {
                    if(!w) { py--; break; }
                    w--;
                }
                printf("%d %d
    ",px,py);
                py++;
            }
            for(int i=l;i<=py;i++)
            {
                if(pd(px,i)&&w)
                {
                    printf("%d %d
    ",px-1,i); w--;
                    if(w) printf("%d %d
    ",px+1,i),w--;
                }
                if((!pd(px,i))&&b)
                {
                    printf("%d %d
    ",px-1,i); b--;
                    if(b) printf("%d %d
    ",px+1,i),b--;
                }
            }
            if(b||w) printf("%d %d
    ",px,py+1);
        }
        return 0;
    }
  • 相关阅读:
    Confluence 6 LDAP 服务器配置
    在 Confluence 6 中连接一个 LDAP 目录
    Confluence 6 设置公共访问
    Confluence 6 为站点禁用匿名用户访问
    Confluence 6 为站点启用匿名用户访问
    Confluence 6 配置用户目录
    Confluence 6 设置公共访问备注
    Confluence 6 为空间赋予公共访问
    Confluence 6 更新目录
    Omad群组部署、依赖部署一键解决
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11603177.html
Copyright © 2011-2022 走看看