码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces-1196E

时间:2019-08-01 17:19:27      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:hit   efi   row   ber   lin   黑白棋   空格   现在   cal   

题目描述:

You are given two integers bb and ww. You have a chessboard of size 109×109109×109 with the top left cell at (1;1)(1;1), the cell (1;1)(1;1) is painted white.

Your task is to find a connected component on this chessboard that contains exactly bb black cells and exactly ww white cells. Two cells are called connected if they share a side (i.e. for the cell (x,y)(x,y) there are at most four connected cells: (x1,y),(x+1,y),(x,y1),(x,y+1)(x−1,y),(x+1,y),(x,y−1),(x,y+1)). A set of cells is called a connected component if for every pair of cells C1C1 and C2C2 from this set, there exists a sequence of cells c1c1, c2c2, ..., ckck such that c1=C1c1=C1, ck=C2ck=C2, all cici from 11 to kk are belong to this set of cells and for every i[1,k1]i∈[1,k−1], cells cici and ci+1ci+1 are connected.

Obviously, it can be impossible to find such component. In this case print "NO". Otherwise, print "YES" and any suitable connected component.

You have to answer qq independent queries.

Input

The first line of the input contains one integer qq (1q1051≤q≤105) — the number of queries. Then qq queries follow.

The only line of the query contains two integers bb and ww (1b,w1051≤b,w≤105) — the number of black cells required and the number of white cells required.

It is guaranteed that the sum of numbers of cells does not exceed 21052⋅105 (w+b2105∑w+∑b≤2⋅105).

Output

For each query, print the answer to it.

If it is impossible to find the required component, print "NO" on the first line.

Otherwise, print "YES" on the first line. In the next b+wb+w lines print coordinates of cells of your component in any order. There should be exactly bb black cells and ww white cells in your answer. The printed component should be connected.

If there are several answers, you can print any. All coordinates in the answer should be in the range [1;109][1;109].

输入描述:

The first line of the input contains one integer q (1q1051≤q≤105) — the number of queries. Then qq queries follow.

The only line of the query contains two integers bb and ww (1b,w1051≤b,w≤105) — the number of black cells required and the number of white cells required.

It is guaranteed that the sum of numbers of cells does not exceed 21052⋅105 (w+b2105∑w+∑b≤2⋅105).

输出描述:

For each query, print the answer to it.

If it is impossible to find the required component, print "NO" on the first line.

Otherwise, print "YES" on the first line. In the next b+wb+w lines print coordinates of cells of your component in any order. There should be exactly bb black cells and ww white cells in your answer. The printed component should be connected.

If there are several answers, you can print any. All coordinates in the answer should be in the range [1;109][1;109].

样例描述:

技术图片题目大意:给定一个10^9X10^9的黑白棋盘,左上角坐标(1,1)的为白色空格。现在给你一个b值和w值,b对应的是黑色格子,w对应的是白色格子,要求你取得一个连通块,连通块中白色\黑色格子的数量与w和b对应。连通块的标准是:只有上下左右才算联通。

解题思路:构造,黑白相间的棋盘有很多规律可循,具体看代码注释。

#pragma GCC optimize(3)
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<array>
#include<sstream>
#include<string>
#include<cstring>
#include<cmath>
#include<cassert>
#include<cstdlib>
#include<utility>
#include<iterator>
#include<iomanip>
using namespace std;
#define lowbit(x) x&(-x)
typedef long long ll;
typedef long double lb;
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);
    int q,b,w;
    cin>>q;
    while(q--)
    {
        cin>>b>>w;//b是黑色格子,w是白色格子
        vector<pair<int,int>> vc;
        bool f = b < w;//记录b和w的关系
        if(f) swap(b,w);//这里交换值只是一个形式上的需要,我用b>w的情况更好构造
        int x1 = 2, y1 = 2;//我们以第二行第二列的单元格为起点,从白色格子开始
        while(w>0)//白色格子大于0
        {
            if(!((x1+y1)&1))
            {
                vc.push_back({x1,y1});
                w--;
            }else
            {
                vc.push_back({x1,y1});
                b--;
            }
            y1++;
        }
        int x2 = 1, y2 = 2;//从第一行开始遍历,去除多余的黑色格子
        while(b>0&&y2<=y1)
        {
            b--;
            vc.push_back({x2,y2});
            y2+=2;
        }
        x2 = 3, y2 = 2;//从第三行开始遍历,去除多余的黑色格子
        while(b>0&&y2<=y1)
        {
            b--;
            vc.push_back({x2,y2});
            y2+=2;
        }
        if(b>0)//此时还有剩余的黑色格子的话,就把第二行第一列的黑色格子算进去
        {
            b--;
            vc.push_back({2,1});
        }
        if(b>0)//此时还有剩余的黑色格子的话,就把第二行第y1列的黑色格子算进去
        {
            b--;
            vc.push_back({2,y1});
        }
        if(b>0)//进行上述操作后依旧还有黑色格子,说明无法构造
        {
            cout<<"NO"<<endl;
        }else
        {
            cout<<"YES"<<endl;
            for(pair<int,int> p : vc)
            {
                cout<<p.first<<" "<<p.second+(int)f<<endl;//这里要注意加上f
            }
        }
    }
    return 0;
}

 

Codeforces-1196E

标签:hit   efi   row   ber   lin   黑白棋   空格   现在   cal   

原文地址:https://www.cnblogs.com/cloudplankroader/p/11283873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!