[codeforces 1333B] Kind Anton 统计区间0,1,-1出现的情况

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;
}
发布了660 篇原创文章 · 获赞 562 · 访问量 48万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/105403377
今日推荐