Codeforces-1196E

題目描述:

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章