这里参考了某人很弓虽的解法。
对于数据a1,a2,a3,...,an。考虑sigma(i=1~j,ai)(j=1~n)这n个数
当a(k-1),ak,a(k+1)变换一次成为a`(k-1)=ak+a(k+1),a`k=-ak,a`(k+1)=ak+a(k+1)以后,
sigma(i=1~k-1,a`i) = sigma(i=1~k-2,ai) + a`k = sigma(i=1~k,a`i)
sigma(i=1~k,a`i) = sigma(i=1~k-1,a`i) + a`k = sigma(i=1~k-1,a`i)
sigma(i=1~k+1,a`i) = sigma(i=1~k,a`i) + a`k = sigma(i=1~k+1,a`i)
可以发现新的sigma(ai)数列中,仅仅是sigma(i=1~k-1,ai)和sigma(i=1~k,ai)换了一个位置。
于是我们也就知道,如果能够用有限次交换从一个状态达到另一个状态,两个状态的sigma值可以一一对应起来。
所以,我们将两个输入数据取和以后存到两个数组里,排序后一一判断,只有当两个数组完全相同时才输出有解。否则就无解。
对于数据a1,a2,a3,...,an。考虑sigma(i=1~j,ai)(j=1~n)这n个数
当a(k-1),ak,a(k+1)变换一次成为a`(k-1)=ak+a(k+1),a`k=-ak,a`(k+1)=ak+a(k+1)以后,
sigma(i=1~k-1,a`i) = sigma(i=1~k-2,ai) + a`k = sigma(i=1~k,a`i)
sigma(i=1~k,a`i) = sigma(i=1~k-1,a`i) + a`k = sigma(i=1~k-1,a`i)
sigma(i=1~k+1,a`i) = sigma(i=1~k,a`i) + a`k = sigma(i=1~k+1,a`i)
可以发现新的sigma(ai)数列中,仅仅是sigma(i=1~k-1,ai)和sigma(i=1~k,ai)换了一个位置。
于是我们也就知道,如果能够用有限次交换从一个状态达到另一个状态,两个状态的sigma值可以一一对应起来。
所以,我们将两个输入数据取和以后存到两个数组里,排序后一一判断,只有当两个数组完全相同时才输出有解。否则就无解。
#include<iostream>
using namespace std;
void Sort(long a[],int data);
int main()
{
long data,n,i,a[10000],b[10000],temp;
cin>>data;
while(data-- > 0)
{
cin>>n;
for(i=1,cin>>a[0];i<n;i++)
{
cin>>temp;
a[i]=a[i-1]+temp;
}
for(i=1,cin>>b[0];i<n;i++)
{
cin>>temp;
b[i]=b[i-1]+temp;
}
Sort(a,n);
Sort(b,n);
int flag=1;
for(i=0;i<n;i++)
if(a[i]!=b[i])
{
flag=0;
break;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void Sort(long a[],int data)
{
long temp;
int count1,count2,min;
for(count1=0;count1<data-1;count1++)
{
min=count1;
for(count2=count1+1;count2<data;count2++)
if(a[min]>a[count2]) min=count2;
if(min!=count1)
{
temp=a[count1];
a[count1]=a[min];
a[min]=temp;
}
}
}
using namespace std;
void Sort(long a[],int data);
int main()
{
long data,n,i,a[10000],b[10000],temp;
cin>>data;
while(data-- > 0)
{
cin>>n;
for(i=1,cin>>a[0];i<n;i++)
{
cin>>temp;
a[i]=a[i-1]+temp;
}
for(i=1,cin>>b[0];i<n;i++)
{
cin>>temp;
b[i]=b[i-1]+temp;
}
Sort(a,n);
Sort(b,n);
int flag=1;
for(i=0;i<n;i++)
if(a[i]!=b[i])
{
flag=0;
break;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
void Sort(long a[],int data)
{
long temp;
int count1,count2,min;
for(count1=0;count1<data-1;count1++)
{
min=count1;
for(count2=count1+1;count2<data;count2++)
if(a[min]>a[count2]) min=count2;
if(min!=count1)
{
temp=a[count1];
a[count1]=a[min];
a[min]=temp;
}
}
}