目录
原题描述:
时间限制: 1000ms
空间限制: 262144kb
题目描述
新年到了,小乌和小漆每人都从妈妈那里获得了n种糖果(序号为1到n),小乌和小漆获得的每种糖果数量不完全相同。他们可以知道自己和对方获得的每种糖果数量。小漆想得到和小乌完全一样的糖果数量(即两人每种糖果数量完全一致),他可以通过以下操作向妈妈交易糖果:对于第i种糖果( ),可以通过交换,使得第
种糖果的数量为第
种糖果数量与第
种糖果数量的和减去第
种糖果数量。例:小漆获得的糖果数量分别为
,那么他可以将第22种糖果数量变为
。
小漆可以和妈妈交易无数次,但是他不知道能不能得到和小乌一样的糖果。如果他通过无数次操作,拥有的每种糖果数量都跟小乌一样,那么可以小漆会很开心,发出的声音;如果不可以,小漆会很难过发出
的声音。你能知道小漆会发出什么声音吗?
输入格式
第一行输入一个整数 ,表示测试数据组数。
每组测试数据第一行包含一个整数,表示
种糖果。
每组测试数据第二行包含个整数
表示小漆获得的每种糖果的数量。
每组测试数据第三行包含个整数
表示小乌获得的每种糖果的数量。
注:本题输入数据较多,建议优化输入。
输出格式
对于每组数据,一行一个答案( or ����wuwu )。
如果小漆可以通过无数次交易,拥有的每种糖果数量都和小乌一样,输出;如果不可以,输出
样例
Input 1
2
7
1 5 3 7 8 6 2
1 -1 3 4 2 6 2
6
-7 4 13 11 42 8
-7 -9 2 10 -23 8
Output 1
happy
wuwu
Input 2
3
7
6 8 7 3 2 6 11
6 2 4 3 7 10 11
10
5 4 8 6 9 4 3 6 8 10
5 4 2 5 0 4 3 5 7 10
4
1 4 3 5
1 3 6 5
Output 2
wuwu
happy
happy
数据范围
对于所有测试数据有:,
,
主要思路:
看看这道题,你也许会想:这咋做啊???
接着,看看数据范围,你考虑暴力。
但是,问题来了,怎么暴力???
dfs?,for循环??好像暴力也不可行(如果谁想到暴力写法,再评论区留言)
所以,你放弃了这一题。
好好好,不说偏了,来看看具体怎么做。
仔细的读者会看看文章标签:交换差分。
没错,就是这样。
我们来举个粒子。
假设小漆的糖果数量如下:
1,5,3,7,8,6,2。
我们求出差分数组(chafen[i] = a[i]-a[i-1] 2<=i<=n)
差分数组:4,-2,4,1,-2,-4。
假设我们交易第二种类糖果。
交易后:
1,(1+3)-5=-1,3,7,8,6,2。
我们再求一遍差分数组。
-2,4,4,1,-2,-4
发现了啥???
对于任意的交易,差分数组只是交换了一下,具体值没有改变。
所以你只需要求出a,b两个数组,判断里面的元素是否相同。
小细节:
1:数据大,用cin会超时,要:ios::sync_with_stdio(0);cin.tie(0);
2:题目中说了,头尾不能交易,所以如果头尾不同,就不可以。
代码code:
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int a[100010];
int b[100010];
int cha[100010],cha1[100010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
if(a[1]!=b[1]||a[n]!=b[n])
{
cout<<"wuwu\n";
continue;
}
for(int i=2;i<=n;i++)
{
cha[i] = a[i]-a[i-1];
}
for(int i=2;i<=n;i++)
{
cha1[i] = b[i]-b[i-1];
}
sort(cha+2,cha+n+1);
sort(cha1+2,cha1+n+1);
int flag=0;
for(int i=2;i<=n;i++)
{
if(cha[i]!=cha1[i])
{
flag = 1;
cout<<"wuwu\n";
break;
}
}
if(!flag)
{
cout<<"happy\n";
}
}
return 0;
}