P7338 『MdOI R4』Color
题目描述
小 M 同学有一张 222 行 nnn 列的方格纸,一开始所有格子都是白色的。
她决定对一些格子染色,具体地,每次她会选择两个相邻的(四联通的,也就是有公共边的)白色格子,其中一个染成红色,另一个染成蓝色。
她的目标是通过任意次操作让指定的一些格子变成红色,对其他格子没有要求。请你帮她判断一下,能否通过上述操作达成目标呢?
输入格式
本题包含多组数据。 第一行有一个正整数 TTT 表示数据组数。
接下来 TTT 组数据,每组数据三行,包括:
- 第一行,一个正整数 nnn 表示方格纸列数。
- 第二行,一个 010101 串 p1…np_{1\ldots n}p1…n,其中 pi=1p_i=1pi=1 表示第 111 行第 iii 列必须是红色,否则不作要求。
- 第三行,一个 010101 串 q1…nq_{1\ldots n}q1…n,其中 qi=1q_i=1qi=1 表示第 222 行第 iii 列必须是红色,否则不作要求。
输出格式
TTT 行,每行对应一组数据。
对于每组数据,如果可以做到输出 RP
,否则输出 ++
。
输入输出样例 #1
输入 #1
3
5
01110
10010
5
11000
01100
5
00101
10100
输出 #1
RP
++
RP
说明/提示
【样例解释】
上图中左侧为第一组测试数据的一种方案,右侧为第三组测试数据的一种方案,对于第二组测试数据,并没有满足要求的方案。
【数据规模与约定】
本题采用捆绑测试
子任务编号 | n≤n\len≤ | 特殊性质 | T≤T\leT≤ | 分值 |
---|---|---|---|---|
111 | 333 | 无特殊限制 | 101010 | 101010 |
222 | 101010 | 无特殊限制 | 101010 | 202020 |
333 | 无特殊限制 | 所有 111 都在同一行 | 101010 | 111 |
444 | 无特殊限制 | 111 不超过 444 个 | 101010 | 131313 |
555 | 10310^3103 | 无特殊限制 | 101010 | 252525 |
666 | 无特殊限制 | 无特殊限制 | 101010 | 303030 |
777 | 161616 | 无特殊限制 | 655366553665536 | 111 |
对于所有数据,满足 1≤n≤1051\le n\le 10^51≤n≤105,∑n≤220\sum n\le 2^{20}∑n≤220。
C++实现
#include<bits/stdc++.h>
using namespace std;
int t,n;
char up[100005],down[100005];
bool cup(int x){//尝试给上面这行第x个位置染色
if(up[x]!='0')return 1;
up[x]='2';return 0;}
bool cdown(int x){//尝试给下面这行第x个位置染色
if(down[x]!='0')return 1;
down[x]='2';return 0;}
int main(){
for(scanf("%d",&t);t;t--){
scanf("%d%s%s",&n,up,down);
bool flag=1;
if(up[0]=='1'&&cdown(0)&&cup(1)||down[0]=='1'&&cup(0)&&cdown(1))
flag=0;
for(int i=1;i<n;i++)
if(up[i]=='1'&&cup(i-1)&&cdown(i)&&cup(i+1)||down[i]=='1'&&cdown(i-1)&&cup(i)&&cdown(i+1)){
flag=0;break;
}
if(flag)puts("RP");
else puts("++");
}
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容