题目
给你两个序列c[]和d[]
允许一个序列c[]中的元素进行一次这样的操作:
允许操作无限次,问两个序列最终是否能相同
思路来源
https://blog.csdn.net/westbrook1998/article/details/86775310
题解
安利的这位博主的题解写的是太漂亮了QAQ
直接扒过来应该不会打我吧(逃
这种xjb操作问重不重合的题,
不妨操作一个元素看看能给别的元素带来什么影响
差分数组只能保证相对关系不变,
对于数轴上的点1-点n(按升序排序),
固定它们两两之间的距离之后形成一条有若干个点的线段,
但是线段可以左右平移,
那再固定一个端点就能保证两条线段完全重合了
所以我们再判一个左端点相同就ok了(右端点也行)
心得
代码不长,然而证明/构造真的是很巧妙啊QAQ
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],b[maxn];
bool solve()
{
sort(a+1,a+n);
sort(b+1,b+n);
for(int i=0;i<n;++i)
if(a[i]!=b[i])return 0;
return 1;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)scanf("%d",&a[i]);
for(int i=n;i>=1;--i)a[i]=a[i]-a[i-1];//倒序构造差分数组 an到a1
for(int i=0;i<n;++i)scanf("%d",&b[i]);
for(int i=n;i>=1;--i)b[i]=b[i]-b[i-1];
if(solve())puts("Yes");
else puts("No");
return 0;
}