2218F 树构造

给定x个节点子树大小为偶数,y个节点子树大小为奇数
明确一点,叶子节点字数大小为1,那么一个偶数大小的节点至少跟着一个奇数节点,所以x必定<=y
再考虑整个树的根,根的子树大小为x+y,如果x+y是偶数,那么此时应该至少有一个偶数节点,即x>0
同理,如若x+y是奇数,那么y>0
满足以上三个条件的树是可以构造的
构造时要扣除根节点,因为根节点已经固定,让每个偶数节点父节点为1(根),子节点再连接一个叶子节点,如若y-x有剩余,让他们直接与根节点相连

include <bits/stdc++.h>

using namespace std;

define int long long

const int N=1010;
vector g[N];
vector<vector> vis(N,vector(N,false));
char s[N][N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void solve()
{
int x,y,i,j;
cin >> x >> y;
int n=x+y;
if(x>y)
{
cout << "NO\n";
return ;
}
if(n%21&&y0)
{
cout << "NO\n";
return ;
}
if(n%20&&x0)
{
cout << "NO\n";
return ;
}
cout << "YES\n";
if(n%2==0)
x--;
else y--;
for(i=1;i<=x;i++)
{
cout << 1 << " " << i+1 <<endl;
cout << i+1 << " " << x+i+1 << endl;
}
for(i=2*x+2;i<=x+y+1;i++)
{
cout << 1 << " " << i << endl;
}

return ;
}
signed main ()
{
int t;
cin >> t;
while(t--)
solve();
return 0;
}

posted @ 2026-05-09 14:53  thy825  阅读(6)  评论(0)    收藏  举报