CF1110E Magic Stones(构造题)
这场CF怎么这么多构造题……
题目大意:给定两个长度为 $n$ 的序列 $c$ 和 $t$。每次我们可以对 $c_i(2\le i<n)$ 进行一次操作,也就是把 $c_i$ 变成 $c_i'=c_{i-1}+c_{i+1}-c_i$。问 $c$ 能否在若干次操作后变成 $t$。
$1\le n\le 10^5,1\le c_i,t_i\le 2\times 10^9$。
很容易考虑差分。我们设 $d_i=c_i-c_{i-1},s_i=t_i-t_{i-1}(2\le i\le n)$。
那么对 $c_i$ 进行一次操作后,
$d_i$ 会变成 $d_i'=c_i'-c_{i-1}=c_{i-1}+c_{i+1}-c_i-c_{i+1}=c_{i+1}-c_i=d_{i+1}$,
$d_{i+1}$ 会变成 $d_{i+1}'=c_{i+1}-c_i'=c_{i+1}-(c_{i-1}+c_{i+1}-c_i)=c_i-c_{i-1}=d_i$。
实际上就是把 $d_i$ 和 $d_{i+1}$ 换了个位置。
很明显,仅仅通过交换相邻元素,就可以把原序列变成任意一种原元素的排列。
而两个序列完全相同,当且仅当它们的第一个元素相同且差分序列完全相同。
所以只需判断 $c_1=t_1$ 且 $d$ 和 $s$ 能通过重排变得完全一样即可。
后半部分如何判断?排个序后看看是否完全一样即可。
时间复杂度 $O(n\log n)$。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,c[maxn],t[maxn],d1[maxn],d2[maxn];
int main(){
n=read();
FOR(i,,n) c[i]=read();
FOR(i,,n) t[i]=read();
if(c[]!=t[]) return puts("No"),; //先判首项相等
bool flag=true;
FOR(i,,n) d1[i]=c[i]-c[i-],d2[i]=t[i]-t[i-]; //两个差分序列
sort(d1+,d1+n+);sort(d2+,d2+n+); //排序
FOR(i,,n) if(d1[i]!=d2[i]){flag=false;break;} //比较
puts(flag?"Yes":"No");
}
CF1110E Magic Stones(构造题)的更多相关文章
- CF1110E Magic Stones 差分
传送门 将原数组差分一下,设\(d_i = c_{i+1} - c_i\) 考虑在\(i\)位置的一次操作会如何影响差分数组 \(d_{i+1}' = c_{i+1} - (c_{i+1} + c_{ ...
- [CF1110E]Magic Stones
题目大意:有一个长度为$n(n\leqslant10^5)$的数列$c$,问是否可以经过若干次变换变成数列$t$,一次变换为$c'_i=c_{i+1}+c_{i-1}-c_i$ 题解:思考一次变换的本 ...
- 【CF1110E】 Magic Stones - 差分
题面 Grigory has n n magic stones, conveniently numbered from \(1\) to \(n\). The charge of the \(i\)- ...
- E. Magic Stones CF 思维题
E. Magic Stones time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- cf251.2.C (构造题的技巧)
C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...
- hdu4671 Backup Plan ——构造题
link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
- BZOJ 3097: Hash Killer I【构造题,思维题】
3097: Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 963 Solved: 36 ...
随机推荐
- mysql事务,select for update,及数据的一致性处理
在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读) 在SELECT 的读取锁定主要分为两种方式: SELECT ... ...
- WPF编程,C#中弹出式对话框 MessageBox 的几种用法。
原文:WPF编程,C#中弹出式对话框 MessageBox 的几种用法. 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. 2.Mes ...
- POJ3278&&1426&&3126&&3087&&3414
接上次的,标签是BFS专题 其实无论是Deepth还是Breadth都是Search 3278 又是撸过的题目 1426 找一个十进制数(我刚开始看样例以为是二进制数),使得它每一位上都是1或0,且是 ...
- MView的DDL查找:
Select dbms_metadata.get_ddl('MATERIALIZED_VIEW','MVIEW_NAME') from dual:
- C++中前置声明介绍
前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...
- ubuntu安装微信客户端
安装linux微信: apt-get install git git clone https://github.com/geeeeeeeeek/electronic-wechat.git cd ele ...
- docker之故障问题解决方案
1.报错如下一 Error response from daemon: driver failed programming external connectivity on endpoint lnmp ...
- [git hooks] pre-commit 配置
在开发过程中,通常使用 eslint 来规范团队的代码风格.但是 eslint 只能在开发服务器启动的时候才去检验代码.如果一个人在不启动开发服务器的情况下,修改了代码直接提交到git,那么别人pul ...
- 微软职位内部推荐-Software Development Engineer II_Commerce
微软近期Open的职位: Are you looking for a high impact project that involves processing of billions of dolla ...
- 【MOOC EXP】Linux内核分析实验一报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [反汇编一个简单的C程序] 实验 ...