Codeforces Round #632 (Div. 2) 比赛人数12810
[codeforces 1333B] Kind Anton 统计区间0,1,-1出现的情况
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1333/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Kind Anton | GNU C++17 | Accepted | 62 ms | 1900 KB |
样例模拟如下
5
3
1 -1 0
1 1 -2
a 1 -1 0
b 1 1 -2
b的位置1 1=1
b的位置2 1=-1+1*2
b的位置3 -2=0+(-1)*2
b的各个位置值均可实现,输出YES
3
0 1 1
0 2 2
a 0 1 1
b 0 2 2
b的位置1 0=0
b的位置2 2=1+0*? 不可实现
b的位置2的值不可实现,输出NO
2
1 0
1 41
a 1 0
b 1 41
b的位置1 1=1
b的位置2 1=0+1*41
b的各个位置值均可实现,输出YES
2
-1 0
-1 -41
a -1 0
b -1 -41
b的位置1 -1=-1
b的位置2 -41=0+(-1)*41
b的各个位置值均可实现,输出YES
5
0 1 -1 1 -1
1 1 -1 1 -1
a 0 1 -1 1 -1
b 1 1 -1 1 -1
b的位置1 1=0 不可实现
b的位置1的值不可实现,输出NO
清楚了样例生成过程后,就可以开始编码,具体细节请看代码
#include <stdio.h>
#define maxn 100010
int a[maxn],b[maxn],cnt[3][maxn];//0:0;1:1;-1:2
int main(){
int t,n,i,j,d,flag;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(j=0;j<3;j++)
for(i=1;i<=n;i++)
cnt[j][i]=0;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)scanf("%d",&b[i]);
if(b[1]!=a[1]){//两数组第1个元素值不相同
printf("NO\n");
continue;
}
for(i=1;i<=n;i++){
for(j=0;j<3;j++)cnt[j][i]=cnt[j][i-1];
if(a[i]==0)cnt[0][i]++;//cnt[0][i]记录数组a在脚标区间[1,i]存在元素值为0的个数
else if(a[i]==1)cnt[1][i]++;//cnt[1][i]记录数组a在脚标区间[1,i]存在元素值为1的个数
else if(a[i]==-1)cnt[2][i]++;//cnt[2][i]记录数组a在脚标区间[1,i]存在元素值为2的个数
}
flag=0;
for(i=2;i<=n;i++){
d=b[i]-a[i];
if(d>0){
if(cnt[1][i-1]==0){//数组a在脚标区间[1,i-1]不存在元素值为1的情况
printf("NO\n");
flag=1;
break;
}
}else if(d<0){
if(cnt[2][i-1]==0){//数组a在脚标区间[1,i-1]不存在元素值为-1的情况
printf("NO\n");
flag=1;
break;
}
}
}
if(flag==0)printf("YES\n");
}
return 0;
}