#include<bits/stdc++.h>
#define ll long long
using namespace std;
/*
题意:给出一个数组a和数组b,a中只存在1,0,-1三种数字,b中是任意的数,能否使a通过(条件:a中任意下标的数只能加上它前面的数)操作变成b
只需要关注1和-1,+1能增大,-1能减小,只要看想要改变的数前面有没有1或-1就行
*/
int main( )
{
ll t,n;
cin>>t;
while(t--)
{
cin>>n;
ll a[n],b[n],zz=0,ff=0,p1=0,p2=0,x=0;
for(int i=0; i<n; i++)
{
cin>>a[i];
if(a[i]==1&&p1==0)//找到最靠前的那个1的下标 #注意a中不存在1的情况,在后面利用p1的值来判断#
{
zz=i;
p1=1;
}
if(a[i]==-1&&p2==0)//找到最靠前的那个-1的下标
{
ff=i;
p2=1;
}
}
for(int i=0; i<n; i++)
{
cin>>b[i];
}
for(int i=n-1; i>=0; i--)
{
if(b[i]<a[i])//判断前面有没有-1能使a[i]减小
{
if(i>ff&&p2==1)//当a中不存在-1,即ff=0时,ff一定小于i(刚开始忽视了这一点wa了
continue;
else
{
cout<<"NO"<<endl;
x=1;
break;
}
}
else if(b[i]>a[i])//判断前面有没有1能使a[i]增大
{
if(i>zz&&p1==1)//当a中不存在1,即zz=0时,zz一定小于i
continue;
else
{
cout<<"NO"<<endl;
x=1;
break;
}
}
}
if(x==0)cout<<"YES"<<endl;
}
return 0;
}
原文:https://www.cnblogs.com/SyrupWRLD999/p/12983686.html