CF1110E Magic Stones

10 篇文章 0 订阅
8 篇文章 0 订阅
H y p e r l i n k Hyperlink Hyperlink

http://codeforces.com/problemset/problem/1110/E

D e s c r i p t i o n Description Description

给定两个长度为 n n n度序列 A , B A,B A,B
对于 A A A中的一个数 A i A_i Ai,你可以将其变成 A i ‘ = A i + 1 + A i − 1 − A i , i ∈ ( 1 , n ) A_i^`=A_{i+1}+A_{i-1}-A_i,i\in(1,n) Ai=Ai+1+Ai1Ai,i(1,n)
问是否存在一种方案,使得 A A A变成 B B B

数据范围: n ≤ 1 0 5 n\leq 10^5 n105


S o l u t i o n Solution Solution

首先由于 i i i范围的受限,第一位和第 n n n位的 A , B A,B A,B必须对应相等

考虑转换操作,以下均满足 i ∈ ( 1 , n ) i\in(1,n) i(1,n)
A i ‘ = A i + 1 + A i − 1 − A i A_i^`=A_{i+1}+A_{i-1}-A_i Ai=Ai+1+Ai1Ai

a i = A i − A i − 1 a_i=A_i-A_{i-1} ai=AiAi1(即 A A A的差分数组),现在 A i A_i Ai变成了 A i + 1 + A i − 1 − A i A_{i+1}+A_{i-1}-A_i Ai+1+Ai1Ai
带入 a i a_i ai得到 a i = A i + 1 + A i − 1 − A i − A i − 1 = A i + 1 − A i = a i + 1 a_i=A_{i+1}+A_{i-1}-A_i-A_{i-1}=A_{i+1}-A_i=a_{i+1} ai=Ai+1+Ai1AiAi1=Ai+1Ai=ai+1

也就是说,对 A i A_i Ai执行一次上述操作,相当于做一次 s w a p ( a i , a i + 1 ) swap(a_i,a_{i+1}) swap(ai,ai+1)

而我们知道,差分数组相同的两个数组自然也相同

问题转换成为给定两个差分数组 a , b a,b a,b,每次可以交换 a a a的两个相邻的数(其实相当于可以随意调顺序了,因为可以操作无限次),是否存在一种方案,使得 a = b a=b a=b

显然对 a , b a,b a,b排序后判断是否相同即可

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)


C o d e Code Code
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;int n,a[100010],b[100010];
inline LL read()
{
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
signed main()
{
	n=read();
	for(register int i=1;i<=n;i++) a[i]=read();
	for(register int i=1;i<=n;i++) b[i]=read();
	if(a[1]!=b[1]||a[n]!=b[n]) return puts("No")&0;
	for(register int i=1;i<=n;i++) a[i]=a[i+1]-a[i],b[i]=b[i+1]-b[i];
	sort(a+1,a+1+n);sort(b+1,b+1+n);
	for(register int i=1;i<=n;i++) if(a[i]!=b[i]) return puts("No")&0;
	puts("Yes");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值