[bzoj5071][数论]小A的数字

109 篇文章 4 订阅
63 篇文章 0 订阅

Description

小A成为了一个数学家,他有一串数字A1,A2…An
每次可以进行如下操作,选择一个数字i,将(Ai-1,Ai,Ai+1)
变为(Ai-1 + Ai,-Ai,Ai+1 + Ai),特别地,若i=N,则(An-1,An)变为
(An-1 + An,-An).小A很好奇,能否通过若干次操作,得到他的幸运数列B1,B2…Bn.可是他太小,不会算,请你帮帮他

Input

第一行一个正整数T 表示数据组数。 每一组数据有三行,其中:
第一行一个正整数n,表示每一串数字的个数, 第二行n 个用空格隔开的整数a1 a2 a3 …. an, 第三行n 个用空格隔开的整数b1 b2 b3 … bn 。

Output

对于每一组数据,输出一行”YES”或”NO”(不含双引号),表示能否通过若 干次操作得到b 数列。

Sample Input

2
6
1 6 9 4 2 0
7 -6 19 2 -6 6
4
1 2 3 4
4 2 1 3

Sample Output

YES
NO

Hint

Explanation for the Sample 第一组数据中,可以依次取i=2,4,5,每次得到的新数列如下: 第一次,
i=2,得到7,-6,15,4,2,0, 第二次, i=4,得到7,-6,19,-4,6,0, 第三次,
i=5,得到7,-6,19,2,-6,6,所以可以得到b 数列。 第二组数据中,不可能做到这一点。

题解

昨天晚上看见dalao们各种说O(n)于是怒想1h 顺便挂了
前缀和???好像有点道理
设sum[i]为 1~i 的前缀和
来看三元组的变换操作
a[i-1],a[i],a[i+1]变为a[i-1]+a[i],-a[i],a[i+1]+a[i]
对于sum数组,变换如下
sum[i-1],sum[i],sum[i+1]变为sum[i-1]+a[i],sum[i]-a[i]-a[i]+a[i],sum[i+1]-a[i]-a[i]+a[i]+a[i]
化简一下
sum[i-1]+a[i]=sum[i]
sum[i]-a[i]-a[i]+a[i]=sum[i]-a[i]=sum[i-1]
sum[i+1]-a[i]-a[i]+a[i]+a[i]=sum[i+1]
变为sum[i],sum[i-1],sum[i+1]
对比sum[i-1],sum[i],sum[i+1]
可以发现,每一次变换三元组,都是交换前两个位置的前缀和数组
那么,我们搞出a和b的前缀和。只要a和b的前缀和换来换去可以换成一样的,那么就ok
怎么判断?前缀和从小到大排一遍啊。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int a[110000],b[110000];
int n;
int main()
{
    int T,tmp;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        a[0]=b[0]=0;
        for(int i=1;i<=n;i++){scanf("%d",&tmp);a[i]=a[i-1]+tmp;}
        for(int i=1;i<=n;i++){scanf("%d",&tmp);b[i]=b[i-1]+tmp;}
        sort(a+1,a+1+n);
        sort(b+1,b+1+n);
        bool bk=false;
        for(int i=1;i<=n;i++)if(a[i]!=b[i]){bk=true;break;}
        if(bk==false)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值