[BZOJ 5071]小A的数字

[BZOJ 5071]小A的数字

  • Description
    小A成为了一个数学家,他有一串数字A1,A2…An
    每次可以进行如下操作,选择一个数字i(1<i<=n),将(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表示组数。
    每一组数据有3行,其中:
    第1行一个正整数n,表示每一串数字的个数
    第2行n个用空格隔开的整数,A1,A2…An
    第3行n个用空格隔开的整数,B1,B2…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第一组数据中,可以依次取 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 数列。
    第二组数据中,不可能做到这一点。
  • 题解
    做的时候以为只能从左往右操作…
    我么考虑操作(Ai-1,Ai,Ai+1) 为(Ai-1+ Ai,- Ai, Ai+1+ Ai)
    做一次前缀,即为(Ai-1,Ai+Ai-1,Ai+1+Ai+Ai-1)操作成(Ai-1+Ai,Ai-1,Ai+1+Ai+Ai-1)

实际上我们发现就是交换了前面两个元素的位置。
等于说我的每次操作就是交换前缀和数组的元素相邻的元素的位置。
所以sort一遍判断 A 和 B 是否相等。

//It is made by Awson on 2017.10.28
#include <iostream>
#include <algorithm>
#define LL long long
#define link LINK
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define Abs(a) ((a)<0?(-(a)):(a))
using namespace std;
const int N = 1e5;
int t,n;
int a[N+5], b[N+5];
void work(){
  scanf("%d", &n);
  for(int i = 1; i <= n; i++) scanf("%d", &a[i]), a[i] += a[i-1];
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]), b[i] += b[i-1];
  sort(a+1, a+n+1); sort(b+1, b+n+1);
  for (int i = 1; i <= n; i++)
    if (a[i] != b[i]) {
      printf("NO\n"); return;
    }
  printf("YES\n");
}
int main() {
  int t;
  cin >> t;
  while(t--)work();
  return 0;
}
发布了12 篇原创文章 · 获赞 14 · 访问量 569

猜你喜欢

转载自blog.csdn.net/Wonderful_Answer/article/details/103390021
今日推荐