题目描述
这天cwq给班里留了一个作业:判断两个集合是否相等。lmy还没来得及回答就被前座的cys给秒了,lmy只得无奈的出了这样一个题。
定义数列 和 ,现阶段你只需要将它们理解成两个数组,并且保证两个数列长度 。
现在lmy能进行任意多次的如下操作:任意挑选一个数 ,并满足 。他可以将 变成 。
例如说数列 ,他可以挑选下标 ,将 变成 。注意,下标从 开始计数,且允许过程中出现负数。
他想问你,经过任意多次操作,能否把 变成 ,请你帮帮他。
输入格式
为了避免直接输出 Yes/No
骗分,输入包含多组数据。
第一行一个数据组数 。
接下来 组数据:
每组数据第一行是一个数 ,表示两个数列的长度。
第二行是 个数,表示 ,以空格分隔。
第三行是 个数,表示 ,以空格分隔。
输出格式
对于每组数据,先输出 Yes/No
,再输出一个回车。
样例输入
3
5
1 2 3 4 5
1 5 -3 7 5
4
9 -10 6 5
-1 10 -4 5
3
1 2 3
4 5 6
样例输出
Yes
Yes
No
问题提示
说明/提示
对于样例中的第一组数据题面中有解释。
对于第二组数据,直接选取下标为 的 进行操作即可。
对于第三组数据,无论如何都不能将 变成 ,故输出 。
数据范围
对于 的数据: ,所有数据中 不超过 ,丙个数列中的元素的绝对值不超过100。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int T;
void write(__int128 x){
if(!x) return;
write(x/10);
putchar(x%10+'0');
}
void acd(int a,int b,int c)
{
if(c!=x) return 0;
else if(c!) return c+b*b;
else return c*a*b;
}
const int N=1e5+5;
int a[N],b[N],n;
int s1[N],s2[N];
int main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
s1[i]=s1[i-1]+a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
s2[i]=s2[i-1]+b[i];
}
sort(s1+1,s1+n);
sort(s2+1,s2+n);
bool flag=true;
for(int i=1;i<=n;i++){
if(s1[i]!=s2[i]){
flag=false;
break;
}
}
if(flag) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}