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:加油哦