1. 程式人生 > >[BZOJ 5071]小A的數字

[BZOJ 5071]小A的數字

sam com 發現 ++ cnblogs 分享 logs ios .com

技術分享

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 數列。
第二組數據中,不可能做到這一點。

技術分享將(Ai-1,Ai,Ai+1)變為(Ai-1 + Ai,-Ai,Ai+1 + Ai)

做前綴和轉化為

(Ai-1,Ai-1+Ai,Ai-1+Ai+Ai+1)變為(Ai-1+Ai,Ai-1,Ai-1+Ai+Ai+1)

發現一次操作相當於交換前綴和的兩位

所以將前綴和排序,判斷相同就行了

zyys

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n;
 7 long long a[100001],b[100001];
 8 int main()
 9 {int T,i,flag;
10     cin>>T;
11     while (T--)
12
{ 13 scanf("%d",&n); 14 for (i=1;i<=n;i++) 15 scanf("%lld",&a[i]),a[i]+=a[i-1]; 16 for (i=1;i<=n;i++) 17 scanf("%lld",&b[i]),b[i]+=b[i-1]; 18 sort(a+1,a+n+1); 19 sort(b+1,b+n+1); 20 flag=0; 21 for (i=1
;i<=n;i++) 22 if (a[i]!=b[i]) 23 {flag=1;break;} 24 if (flag==0) printf("YES\n"); 25 else printf("NO\n"); 26 } 27 }

[BZOJ 5071]小A的數字