[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

Output

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 数列。
第二组数据中,不可能做到这一点。

题解

做的时候以为只能从左往右操作...
我么考虑操作$(A_{i-1},A_i,A_{i+1})$为$(A_{i-1} + A_i,-A_i,A_{i+1} + A_i)$。
做一次前缀,即为$(A_{i-1},A_i+A_{i-1},A_{i+1}+A_i+A_{i-1})$操作成$(A_{i-1} + A_i,A_{i-1},A_{i+1} + A_i + A_{i-1})$
实际上我们发现就是交换了前面两个元素的位置。
等于说我的每次操作就是交换前缀和数组的元素相邻的元素的位置。
所以$sort$一遍判断 $A$ 和 $B$ 是否相等。

 

 1 //It is made by Awson on 2017.10.28
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <cmath>
 7 #include <stack>
 8 #include <queue>
 9 #include <vector>
10 #include <string>
11 #include <cstdio>
12 #include <cstdlib>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 #define LL long long
17 #define link LINK
18 #define Min(a, b) ((a) < (b) ? (a) : (b))
19 #define Max(a, b) ((a) > (b) ? (a) : (b))
20 #define Abs(a) ((a) < 0 ? (-(a)) : (a))
21 using namespace std;
22 const int N = 1e5;
23 
24 int t, n;
25 int a[N+5], b[N+5];
26 
27 void work() {
28   scanf("%d", &n);
29   for (int i = 1; i <= n; i++) scanf("%d", &a[i]), a[i] += a[i-1];
30   for (int i = 1; i <= n; i++) scanf("%d", &b[i]), b[i] += b[i-1];
31   sort(a+1, a+n+1); sort(b+1, b+n+1);
32   for (int i = 1; i <= n; i++)
33     if (a[i] != b[i]) {
34       printf("NO\n"); return;
35     }
36   printf("YES\n");
37 }
38 int main() {
39   int t; cin >> t;
40   while (t--) work();
41   return 0;
42 }

 

转载于:https://www.cnblogs.com/NaVi-Awson/p/7745904.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值