题意:
鲍里斯再一次需要安东的帮助来完成一项任务。这次Anton需要解决以下问题:
有两个长度为n的整数数组a和b。结果发现,数组a只包含集合{−1,0,1}中的元素。
Anton可以执行以下操作序列任意次数:
选择任意一对索引(i,j),使1≤i可以多次选择同一对(i,j)。
把ai加到aj。换句话说,数组的第j个元素等于ai+aj。
例如,如果给你一个数组[1,−1,0],你只能通过一个操作把它变换成[1,−1,−1],[1,0,0]和[1,−1,1]。
Anton想要预测是否有可能将这些操作中的某个数(0或多个)应用到数组a上,从而使它等于数组b。您能帮助他吗?
输入
每个测试包含多个测试用例。
第一行包含测试用例t的数量(1≤t≤10000)。测试用例的描述如下。
每个测试用例的第一行包含一个整数n(1≤n≤105)——数组的长度。
每个测试用例的第二行包含n个整数a1,a2,…,an(−1≤ai≤1)——数组a的元素。元素之间可以有重复项。
每个测试用例的第三行包含n个整数b1,b2,…,bn(−109≤bi≤109)——数组b的元素。元素之间可以有重复项。
它保证所有测试用例的n的总和不超过105。
输出
对于每个测试用例,如果可以通过执行所描述的操作使数组a和b相等,则输出一行“YES”,如果不可能,则输出“NO”。
您可以打印每个字母在任何情况下(上或下)。
题解:
维护a数组的状态,如果b比a大且前面没有1,则NO
如果b比a小且前面没有-1,则NO
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; int T; int N; int a[maxn]; int b[maxn]; int c1,cz; map<int,int> pos; int main () { scanf("%d",&T); while (T--) { scanf("%d",&N); for (int i=1;i<=N;i++) scanf("%d",&a[i]); for (int i=1;i<=N;i++) scanf("%d",&b[i]); c1=0,cz=0; int f=1; for (int i=1;i<=N;i++) { //printf("%d %d ",c1,cz); if (b[i]-a[i]>0) { if (c1==0) { f=0; break; } } else if (b[i]-a[i]<0){ if (cz==0) { f=0; break; } } if (a[i]==1) c1++; if (a[i]==-1) cz++; //printf("%d %d ",c1,cz); } if (f==1) printf("YES "); else printf("NO "); } }