Kind Anton(Codeforces-1333B)

B. Kind Anton
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Once again, Boris needs the help of Anton in creating a task. This time Anton needs to solve the following problem:

There are two arrays of integers a and b of length n. It turned out that array a contains only elements from the set {−1,0,1}.

Anton can perform the following sequence of operations any number of times:

Choose any pair of indexes (i,j) such that 1≤i<j≤n. It is possible to choose the same pair (i,j) more than once.
Add ai to aj. In other words, j-th element of the array becomes equal to ai+aj.
For example, if you are given array [1,−1,0], you can transform it only to [1,−1,−1], [1,0,0] and [1,−1,1] by one operation.

Anton wants to predict if it is possible to apply some number (zero or more) of these operations to the array a so that it becomes equal to array b. Can you help him?

Input
Each test contains multiple test cases.

The first line contains the number of test cases t (1≤t≤10000). The description of the test cases follows.

The first line of each test case contains a single integer n (1≤n≤105) — the length of arrays.

The second line of each test case contains n integers a1,a2,…,an (−1≤ai≤1) — elements of array a. There can be duplicates among elements.

The third line of each test case contains n integers b1,b2,…,bn (−109≤bi≤109) — elements of array b. There can be duplicates among elements.

It is guaranteed that the sum of n over all test cases doesn’t exceed 105.

Output
For each test case, output one line containing “YES” if it’s possible to make arrays a and b equal by performing the described operations, or “NO” if it’s impossible.

You can print each letter in any case (upper or lower).

Example
inputCopy
5
3
1 -1 0
1 1 -2
3
0 1 1
0 2 2
2
1 0
1 41
2
-1 0
-1 -41
5
0 1 -1 1 -1
1 1 -1 1 -1
outputCopy
YES
NO
YES
YES
NO
Note
In the first test-case we can choose (i,j)=(2,3) twice and after that choose (i,j)=(1,2) twice too. These operations will transform [1,−1,0]→[1,−1,−2]→[1,1,−2]
In the second test case we can’t make equal numbers on the second position.

In the third test case we can choose (i,j)=(1,2) 41 times. The same about the fourth test case.

In the last lest case, it is impossible to make array a equal to the array b.

题意;
有2个长度为n得数组,可以选择一对i,j(i<=j),前提是i<=j,然后把ai的值+bi上去,这个操作可以重复无限次,也可以无限次选择同一对i,j,问能不能通过这个操作使得a数组=b数组
思路:
因为a数组只有{-1.0,1}元素
-1是使数字变小,0不变,1是使数字变大
(1)如果ai>bi的话,就需要ai前面有-1来进行无限次操作使得ai=bi。
(2)如果ai<bi的话,就需要ai前面有1来进行无限次操作使得ai=bi。
因为是看前面,所以从a数组后面开始遍历
我第一次使用循环嵌套,如果比出大小,就向前遍历是否存在1/-1,然后我就被T了
在这里插入图片描述
之后就发现如果前面存在这个1、-1的话,之后的所有都可以用,就可以把它标记下来,标记下标的办法,在比较的时候,如果这个下标的vis数组被标记过,就代表在这个下标前存在1、-1。
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
const int N=1e5+9;
int a[N];
int b[N];
bool vis1[N];
bool vis2[N];
int main ()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int f1=0,f2=0;
        memset(vis1,0,sizeof(vis1));//每次使用清零
        memset(vis2,0,sizeof(vis2));
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(f1==1)  vis1[i]=1;//注意标记的顺序,要避免自己本身是1、-1的情况,因为是看这个下标之前是否存在1、-1
            if(f2==1)  vis2[i]=1;
            if(a[i]==-1)
               f1=1;//只要存在一次,后面就都可以用
            else if(a[i]==1)
               f2=1;
        }
        for(int i=0;i<n;i++){
            scanf("%d",&b[i]);
        }
        int f;
        for(int i=n-1;i>=0;i--){
            f=0;
            if(a[i]>b[i]){//比它大,就需要-1来使它减小
                if(vis1[i]==1) f=1;
            }
            else if(a[i]<b[i]){//比他小,就需要1来使它增大
                if(vis2[i]==1) f=1;
            }
            else if(a[i]==b[i])//相等的情况下来可以成立
                f=1;
            if(f==0) {printf("NO\n");break;}//只要有一位不满足就NO,跳出
        }
        if(f==1)
            printf("YES\n");//满足即为YES
    }
    return 0;
}

ps:加油哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值