题目大意:有一个长度为$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;
}

  

最新文章

  1. MFC 如何创建浏览文件夹的对话框
  2. 五、Spring ——单元测试
  3. 在Windows2008系统中利用IIS建立FTP服务器
  4. Gradle学习系列之六——使用Java Plugin
  5. ThinkPHP系的两个东东OneThink和ThinkCMF
  6. react-native 学习
  7. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解
  8. BCTF赛后
  9. shiro能做什么,做j2ee时候要考虑什么
  10. SQL Server 索引的图形界面操作 &lt;第十二篇&gt;
  11. 【MS SQL】查看任务执行进度
  12. python的subprocess:子程序调用(调用执行其他命令);获取子程序脚本当前路径问题
  13. No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android&quot;
  14. JavaSE编程题
  15. js函数使用prototype和不适用prototype的区别
  16. lmbench性能分析工具
  17. 生成树协议(STP)
  18. 趣味编程:静夜思(Swift版)
  19. Odoo创建基础模块和相关内容
  20. flume hdfs一些简单配置记忆

热门文章

  1. python笔记--冒泡排序升级版
  2. aws存储桶s3使用
  3. Shader Variants 打包遇到的问题
  4. 机器学习算法 --- Decision Trees Algorithms
  5. FileZilla-FTP连接失败
  6. exit命令详解
  7. DWR、Comet4j在Nginx+Tomcat组合下的优化
  8. Chapter 3 软件项目管理
  9. Java基础第一节.Java简介
  10. P4论文粗读笔记(一)