小A的数字
题目大意就是给你一种变换操作, 再给你两个数列,让你通过这个操作使一个数列变成另一个, 问这个操作能不能完成
然后看了网上大牛的题解之后知道了可以用前缀和优化(但真的好难想啊
可以看到
sumi−1=sumi−2+ai−1
sumi=sumi−2+ai−1+ai
sumi+1=sumi−2+ai−1+ai+ai+1
然后进行操作得到
sumi−1=sumi−2+ai−1+ai
sumi=sumi−2+ai−1
sumi+1=sumi−2+ai−1+ai+ai+1
可以发现只是i和i-1发生了交换但整体没变
所以我们可以排序之后进行比对判断YES和NO
#include <cstdio>
#include <algorithm>
#define MAXN 100010
using namespace std;
int t, n, x;
int a[MAXN], b[MAXN];
int read() {
int f = 1, k = 0;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(c >= '0'&& c <= '9') {
k = k * 10 + c - '0';
c = getchar();
}
return f * k;
}
int main() {
t = read();
for(int k = 1; k <= t; k ++) {
n = read();
for(int i = 1; i <= n; i ++) {
x = read();
a[i] = a[i - 1] + x;
}
for(int i = 1; i <= n; i ++) {
x = read();
b[i] = b[i - 1] + x;
}
sort (b + 1, b + n + 1);
sort(a + 1, a + n + 1);
bool p = true;
for(int i = 1; i <= n ; i ++) {
if(a[i] != b[i]) {
p = false;
}
}
if(p ) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}