Codeforces Global Round 1 E. Magic Stones(思维+差分技巧)

本文探讨了通过无限次操作使两个序列相同的算法问题。利用差分数组的概念,阐述了如何判断两个序列在操作后的等价性。通过固定序列中元素的相对关系,并确保至少一个端点相同,来验证序列的重合可能性。

题目

给你两个序列c[]和d[]

允许一个序列c[]中的元素进行一次这样的操作:

c_{i}=c_{i+1}+c_{i-1}-ci

允许操作无限次,问两个序列最终是否能相同

思路来源

https://blog.youkuaiyun.com/westbrook1998/article/details/86775310

题解

安利的这位博主的题解写的是太漂亮了QAQ

直接扒过来应该不会打我吧(逃

 

这种xjb操作问重不重合的题,

不妨操作一个元素看看能给别的元素带来什么影响

差分数组只能保证相对关系不变,

对于数轴上的点1-点n(按升序排序),

固定它们两两之间的距离之后形成一条有若干个点的线段,

但是线段可以左右平移,

那再固定一个端点就能保证两条线段完全重合了

所以我们再判一个左端点相同就ok了(右端点也行)

心得

代码不长,然而证明/构造真的是很巧妙啊QAQ

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],b[maxn];
bool solve()
{
	sort(a+1,a+n);
	sort(b+1,b+n);
	for(int i=0;i<n;++i)
	if(a[i]!=b[i])return 0;
	return 1;
}
int main()
{ 
    scanf("%d",&n);
    for(int i=0;i<n;++i)scanf("%d",&a[i]);
    for(int i=n;i>=1;--i)a[i]=a[i]-a[i-1];//倒序构造差分数组 an到a1 
    for(int i=0;i<n;++i)scanf("%d",&b[i]);
    for(int i=n;i>=1;--i)b[i]=b[i]-b[i-1];
    if(solve())puts("Yes");
    else puts("No");
	return 0;
} 

 

Codeforces Round 1036 是一场同时面向 Div.1 和 Div.2 参赛者的比赛,通常这类比赛会包含多个具有挑战性的编程题目,涵盖算法、数据结构、数学等多个领域。比赛的题解和题目信息可以帮助参赛者回顾解题思路,提升编程能力。 ### 比赛基本信息 - **比赛名称**:Codeforces Round #1036 (Div. 1 and Div. 2) - **比赛时间**:具体时间为 UTC+X(根据实际举办日期和时间表) - **比赛链接**:[Codeforces 官方页面](https://codeforces.com/contest/1343) - **题解发布位置**:通常在比赛结束后不久,官方或社区成员会在 Codeforces 博客、GitHub 或其他技术平台上发布题解。 ### 题目类型与难度分布 该轮比赛通常包括 5 到 7 道题目,难度从简单实现到复杂算法不等。例如: - **A题**:通常是简单的模拟或数学问题。 - **B题**:可能涉及字符串处理或基础贪心策略。 - **C题**:中等难度,可能需要掌握基本的数据结构如数组、排序等。 - **D题及以后**:较高难度,可能涉及图论、动态规划、数论等高级算法。 ### 参赛情况与亮点 - **参与人数**:通常超过 10,000 名选手参加。 - **热门话题**:比赛中某些题目可能会引发广泛讨论,尤其是那些需要用到巧妙构造或优化技巧的问题。 - **知名选手表现**:顶尖选手如 tourist、Um_nik 等通常会以极快的速度完成所有题目,并占据排行榜前列。 ### 示例代码片段 以下是一个典型的 Codeforces 题目解法示例,适用于某道中等难度题目: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while(t--) { long long l, r; cin >> l >> r; // 假设 e 是一个预处理好的符合条件的数组 // 使用二分查找来统计区间 [l, r] 内的有效数字个数 long long ans = upper_bound(e.begin(), e.end(), r) - lower_bound(e.begin(), e.end(), l); cout << ans << endl; } return 0; } ``` ### 题解资源推荐 - **Codeforces 官方博客**:通常会有详细的题解和作者说明。 - **GitHub 仓库**:许多参赛者会将自己的解法上传至 GitHub,便于他人学习。 - **知乎专栏 / 优快云 / 博客园**:中文社区中也常有高质量的赛后总结与分析文章。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值