1333B.Kind Anton(前缀和)

题意:

鲍里斯再一次需要安东的帮助来完成一项任务。这次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\n",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\n",c1,cz);
        }
        if (f==1)
            printf("YES\n");
        else 
            printf("NO\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/12687307.html