CF1110E Magic Stones

题目链接:
洛谷
Codeforces

Solution

以前做过这种题,比这题难得多,所以看到就秒了,加强版:[NOIP2021] 方差
再来推一遍:
如果每次操作 \(a_i\),那么差分数组的变化为:

\[d_i=a_i-a_{i-1}=a_{i-1}+a_{i+1}-a_i-a_{i-1}=a_{i+1}-a_i=d_{i+1}\\ d_{i+1}=a_{i+1}-a_i=a_{i+1}-a_{i-1}-a_{i+1}+a_i=a_i-a_{i-1}=d_i \]

即交换差分数组 \(d_i\)\(d_{i+1}\)
所以就简单了,看两个数组的差分数组排序后是否相同。
注意 \(a_1\)\(a_n\) 不能操作,所以如果这两个不对应相等,直接判不能。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=1e6+7;
int a[N],b[N],d1[N],d2[N];
main()
{
	int n;
	read(n);
	for(int i=1;i<=n;i++)read(a[i]),d1[i]=a[i]-a[i-1];
	for(int i=1;i<=n;i++)read(b[i]),d2[i]=b[i]-b[i-1];
	if(a[1]!=b[1]||a[n]!=b[n])
		{puts("No");return 0;}
	sort(d1+1,d1+n+1);
	sort(d2+1,d2+n+1);
	for(int i=1;i<=n;i++)
		if(d1[i]!=d2[i]){puts("No");return 0;}
	puts("Yes");
	return 0;
}
posted @ 2022-08-16 19:47  Epoch_L  阅读(18)  评论(0编辑  收藏  举报