码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1110E]Magic Stones

时间:2019-02-10 17:44:48      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:c++   注意   amp   ++i   sort   strong   长度   思考   ret   

题目大意:有一个长度为$n(n\leqslant10^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

标签:c++   注意   amp   ++i   sort   strong   长度   思考   ret   

原文地址:https://www.cnblogs.com/Memory-of-winter/p/10359547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!