CF1110E Magic Stones

传送门

我一开始以为每个位置只有可能是2个值,然后就GG了
然后摸了一眼题解,这tm怎么这个简单
仔细观察它的式子(c_i=c_{i-1}+c_{i+1}-c_i)
和差分有点像,看看差分数组(d_i=c_i-c_{i-1})
容易发现每一次操作都是将(d_i)(d_{i+1})交换了
那么只需要满足差分数组相同就可以了
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
	char ch; bool ok;
	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e5+10;
int n,m,a[maxn],b[maxn],c[maxn],d[maxn];
int main()
{
	read(n);
	for(rg int i=1;i<=n;i++)read(a[i]);
	for(rg int i=1;i<=n;i++)read(b[i]);
	if(a[1]!=b[1]||a[n]!=b[n]){printf("No
");return 0;}
	for(rg int i=1;i<=n;i++)c[i]=a[i]-a[i-1];
	for(rg int i=1;i<=n;i++)d[i]=b[i]-b[i-1];
	sort(c+1,c+n+1),sort(d+1,d+n+1);
	for(rg int i=1;i<=n;i++)if(c[i]!=d[i]){printf("No
");return 0;}
	printf("Yes
");
}
原文地址:https://www.cnblogs.com/lcxer/p/10364713.html