循 环 流 循环流 循环流
正 解 部 分 \color{red}{正解部分} 正解部分
分类讨论, 设 1 , 2 1,2 1,2 边 的数量分别为 c n t 1 , c n t 2 cnt_1, cnt_2 cnt1,cnt2,
- N = 2 N=2 N=2, c n t 1 cnt_1 cnt1 必须为偶数; 当 c n t 1 = 0 cnt_1=0 cnt1=0 时, c n t 2 cnt_2 cnt2 不为奇数 .
- N > 2 N>2 N>2, 首先讨论 c n t 1 cnt_1 cnt1 和 c n t 2 cnt_2 cnt2 都不为 0 0 0 的情况, 有解的条件是 c n t 1 + c n t 2 ≥ N + 1 cnt_1 + cnt_2 \geq N+1 cnt1+cnt2≥N+1 .
N > 2 N>2 N>2时, 将 1 1 1边 和 2 2 2边 各构成一个环, 控制 所有 1 1 1边 都在 第一个环 里,
第二个环若无法被 2 2 2边 完整地填充, 则通过下图的方式联通两环,
否则只需要将两个点看成一个点, 合起来即可, 从 N + 1 N+1 N+1个点 变成了 N N N 个点 .
- 再讨论其中一种边个数为
0
0
0 的情况, 只需要边的条数 大于等于
N
N
N 即可, 若出现了剩余的边, 这么连就可以了 .
- c n t 1 cnt_1 cnt1 不能等于 1 1 1, 但是 c n t 2 cnt_2 cnt2 可以等于 1 1 1, 此时只需要将一个 1 1 1边 反向, 2 2 2边 正向, 相减后与不加 2 2 2 边没有区别 .
实 现 部 分 \color{red}{实现部分} 实现部分
#include<bits/stdc++.h>
#define reg register
const int maxn = 55;
int read(){
char c;
int s = 0, flag = 1;
while((c=getchar()) && !isdigit(c))
if(c == '-'){ flag = -1, c = getchar(); break ; }
while(isdigit(c)) s = s*10 + c-'0', c = getchar();
return s * flag;
}
int N;
int a;
int b;
void Sc(){
N = read(), a = read(), b = read();
if(a == 1){ puts("0"); return ; }
if(N == 2){
if(a & 1) puts("0");
else if(!a && (b&1)) puts("0");
else if(a+b < N) puts("0");
else puts("1");
return ;
}else{
if((!a || !b) && (a+b >= N)) puts("1");
else if(a && b && a+b >= N+1) puts("1");
else puts("0");
}
}
int main(){
read();
int T = read(); while(T --) Sc();
return 0;
}