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: (x−1,y),(x+1,y),(x,y−1),(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,k−1]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 (1≤q≤1051≤q≤105) — the number of queries. Then qq queries follow.

The only line of the query contains two integers bb and ww (1≤b,w≤1051≤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 2⋅1052⋅105 (∑w+∑b≤2⋅105∑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 (1≤q≤1051≤q≤105) — the number of queries. Then qq queries follow.

The only line of the query contains two integers bb and ww (1≤b,w≤1051≤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 2⋅1052⋅105 (∑w+∑b≤2⋅105∑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;
}

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

时间: 2024-08-30 18:09:23

Codeforces-1196E的相关文章

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #408 (Div. 2) B

Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from 1 to n, placed along the x-axis on a table that has m holes on it. More precisely, cup i is on the table at the position x?=?i. The probl

Codeforces 617 E. XOR and Favorite Number

题目链接:http://codeforces.com/problemset/problem/617/E 一看这种区间查询的题目,考虑一下莫队. 如何${O(1)}$的修改和查询呢? 令${f(i,j)}$表示区间${\left [ l,r \right ]}$内数字的异或和. 那么:${f(l,r)=f(1,r)~~xor~~f(1,l-1)=k}$ 记一下前缀异或和即可维护. 1 #include<iostream> 2 #include<cstdio> 3 #include&l

CodeForces - 601A The Two Routes

http://codeforces.com/problemset/problem/601/A 这道题没想过来, 有点脑筋急转弯的感觉了 本质上就是找最短路径 但是卡在不能重复走同一个点 ---->>> 这是来坑人的 因为这是一个完全图(不是被road 连接  就是被rail连接 ) 所以一定有一条直接连1 和 n的路径 那么只用找没有连 1 和 n 的路径的 那个图的最短路即可 然后这个dijkstra写的是O(V^2)的写法 以后尽量用优先队列的写法O(ElogV) 1 #includ

Codeforces Round #393 div2

A. Petr and a calendar(模拟) http://codeforces.com/problemset/problem/760/A 题意:已知2017年m月1日是星期d,求这个月日历有多少行. 算法:简单模拟或者直接用公式算. 代码: #include<bits/stdc++.h> using namespace std; int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main() {