[CF1110E]Magic Stones

Posted memory-of-winter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1110E]Magic Stones相关的知识,希望对你有一定的参考价值。

题目大意:有一个长度为$n(nleqslant10^5)$的数列$c$,问是否可以经过若干次变换变成数列$t$,一次变换为$c‘_i=c_{i+1}+c_{i-1}-c_i$

题解:思考一次变换的本质,对$c$做差分,原差分为$c_i-c_{i-1},c_{i+1},c_i$;对$c_i$做一次变换后为:$c‘_i-c_{i-1}=c_{i+1}+c_{i-1}-c_i-c_{i-1}=c_{i+1}-c_i,c_{i+1}-c‘_i=c_{i+1}-(c_{i+1}+c_{i-1}-c_i)=c_i-c_{i-1}$,也就是说交换了原差分数组的两位。

所以就把$c$数组差分一下,看是不是和$t$数组相同即可,注意判断$c_1,c_n$是否和$t_1,t_n$相同,因为这两个位置无法做变换。

卡点:

 

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 100010
int n;
int s[maxn], t[maxn];
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) scanf("%d", s + i);
	for (int i = 1; i <= n; ++i) scanf("%d", t + i);
	if (s[1] != t[1] || s[n] != t[n]) {
		puts("No");
		return 0;
	}
	for (int i = n; i + 1; --i) {
		s[i] -= s[i - 1];
		t[i] -= t[i - 1];
	}
	std::sort(s + 2, s + n + 1); std::sort(t + 2, t + n + 1);
	for (int i = 2; i <= n; ++i) if (s[i] != t[i]) {
		puts("No");
		return 0;
	}
	puts("Yes");
	return 0;
}

  

以上是关于[CF1110E]Magic Stones的主要内容,如果未能解决你的问题,请参考以下文章

CF1110E Magic Stones

CF1110E Magic Stones

[CF1110E]Magic Stones

Magic Stones CodeForces - 1110E (思维+差分)

E. Magic Stones CF 思维题

CF 1110 E. Magic Stones