BZOJ5071 小A的数字 BZOJ2017年10月月赛 其他

欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ5071


题意概括

  


题解

  一开始蒙了。

  感觉做过类似的题目。

  但是找不到方法。

  突然想到前缀和!

  对于三元组变换:

  (ai-1,ai,ai+1) => (ai-1+ai,-ai,ai+1+ai)

  我们考虑其前缀和变化:

  设x为sumi-2

  在变换前:

  sumi-1=x+ai-1

  sumi=x+ai-1+ai

  sumi+1=x+ai-1+ai+ai+1

  变换后

  sumi-1=x+ai-1+ai

  sumi=x+ai-1

  sumi+1=x+ai-1+ai+ai+1

  于是我们发现一次操作实际上就是把sumi-1sumi交换了一下。

  那么我们要判断YES或者NO,只需要把a和b数组分别计算前缀和然后再排序比较是否完全相同即可。


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int N=100005;
int T,n,a[N],b[N];
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        a[0]=b[0]=0;
        for (int i=1,x;i<=n;i++){
            scanf("%d",&x);
            a[i]=a[i-1]+x;
        }
        for (int i=1,x;i<=n;i++){
            scanf("%d",&x);
            b[i]=b[i-1]+x;
        }
        sort(a+1,a+n+1);
        sort(b+1,b+n+1);
        bool flag=1;
        for (int i=1;i<=n&&flag;i++)
            if (a[i]!=b[i])
                flag=0;
        puts(flag?"YES":"NO");
    }
    return 0;
}

  

 

posted @   zzd233  阅读(408)  评论(0编辑  收藏  举报
努力加载评论中...

点击右上角即可分享
微信分享提示