Description
给定长度为n的序列a[],每次可以选择位置i,把(a[i-1],a[i],a[i+1])变成(a[i-1]+a[i],-a[i],a[i+1]+a[i])
问是否能将序列a通过以上操作变为序列b
Solution
没有思路的时候就乱搞一下(滑稽
考虑差分,我们并不能看出什么性质
考虑前缀和。可以发现操作的本质就是交换相邻两个位置的前缀和
我们把a[]和b[]的前缀和求出来排序,如果完全相同那么就是可行的
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=2000005;
int s[N],t[N];
int read() {
int x=0,v=1; char ch=getchar();
for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
return x*v;
}
int main(void) {
for (int T=read();T--;) {
int n=read(),flag=false;
rep(i,1,n) s[i]=s[i-1]+read();
rep(i,1,n) t[i]=t[i-1]+read();
std:: sort(s+1,s+n+1);
std:: sort(t+1,t+n+1);
rep(i,1,n) flag|=(s[i]!=t[i]);
puts(flag?"NO":"YES");
}
return 0;
}