专栏文章

题解:P10852 【MX-X2-T1】「Cfz Round 4」Awaken

P10852题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miniv1io
此快照首次捕获于
2025/12/02 03:08
3 个月前
此快照最后确认于
2025/12/02 03:08
3 个月前
查看原文
upd:修正了读取两个 nn 的问题

题目大意

给定一个长度为 nnn5n \ge 5)的序列的部分位置的值,要求判断是否存在一个完整的整数序列,满足:
对于所有满足 x2+x3=x1+x4x_2 + x_3 = x_1 + x_4 的互异下标 x1,x2,x3,x4x_1, x_2, x_3, x_4,都有 ax2+ax3=ax1+ax4a_{x_2} + a_{x_3} = a_{x_1} + a_{x_4}

思路

实际上要求序列是一个等差数列
考虑特殊情况:
x1=i1,x2=i,x3=i+1,x4=i+2x_1 = i-1, x_2 = i, x_3 = i+1, x_4 = i+2,则 (i)+(i+1)=(i1)+(i+2)(i) + (i+1) = (i-1) + (i+2) 根据条件得到:ai+ai+1=ai1+ai+2a_i + a_{i+1} = a_{i-1} + a_{i+2}
对于等差数列 ai=a1+(i1)da_i = a_1 + (i-1)d,有:
  • ai+ai+1=[a1+(i1)d]+[a1+id]=2a1+(2i1)da_i + a_{i+1} = [a_1 + (i-1)d] + [a_1 + id] = 2a_1 + (2i-1)d
  • ai1+ai+2=[a1+(i2)d]+[a1+(i+1)d]=2a1+(2i1)da_{i-1} + a_{i+2} = [a_1 + (i-2)d] + [a_1 + (i+1)d] = 2a_1 + (2i-1)d
两者相等,满足条件。

实现

比较简单,需要注意一下特殊情况。
如果 m=0m = 0,总是可以构造一个等差数列(如全 0 序列),输出 Yes
如果 m=1m = 1,总是可以构造一个等差数列(如所有项等于已知值),输出 Yes
如果 m2m \ge 2
先将已知点按位置排序,再计算相邻点的位置差和值差,确定公差 d=api+1apipi+1pid = \frac{a_{p_{i+1}} - a_{p_i}}{p_{i+1} - p_i},然后检查所有已知点是否满足等差数列关系。
如果所有点都满足且公差为整数,输出 Yes,否则输出 No

代码

CPP
//#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define ull unsigned long long 
#define int long long
using namespace std;
using ll=long long;
inline void read(int& a) {
	int w=1;char c;a=0;
	while((c=getchar())<'0'||c>'9')if(c=='-')w=-1;
	do a=a*10+(c^48); while((c=getchar())>='0'&&c<='9');
	a*=w;
}
void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
	return ;
}
const int N=1e9;
void solve(){
	int n,m;
	read(n),read(m);
	vector<pair<int,int>>a(m);
	for(int i=0;i<m;i++)read(a[i].first),read(a[i].second);
	if(m<=1){
		puts("Yes");
		return;
	}
	sort(a.begin(),a.end());
	bool is=1;
	int num=a[1].second-a[0].second;
	int numm=a[1].first-a[0].first;
	if(num%numm!=0)is=0;
	else {
		int d=num/numm;
		int pos=a[0].second-(a[0].first-1)*d;
		for(auto [x,y]:a){
			if(pos+(x-1)*d!=y){
				is=0;break;
			}
		}
	}
	if(is)puts("Yes");
	else puts("No");
}
signed main() {
	int T;
	read(T);
	while(T--)solve();
	return 0;
}
//
//              ⠀⢸⣿⣿⣿⠀⣼⣿⣿⣦⡀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀ ⠀⢸⣿⣿⡟⢰⣿⣿⣿⠟⠁
// ⠀⠀⠀⠀⠀⠀⠀⢰⣿⠿⢿⣦⣀⠀⠘⠛⠛⠃⠸⠿⠟⣫⣴⣶⣾⡆
// ⠀⠀⠀⠀⠀⠀⠀⠸⣿⡀⠀⠉⢿⣦⡀⠀⠀⠀⠀⠀⠀ ⠛⠿⠿⣿⠃
// ⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⠀⠀⠹⣿⣶⡾⠛⠛⢷⣦⣄⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⠀⠀⠈⠉⣀⡀⠀ ⠀⠙⢿⡇
// ⠀⠀⠀⠀⠀⠀⢀⣠⣴⡿⠟⠋⠀⠀⢠⣾⠟⠃⠀⠀⠀⢸⣿⡆
// ⠀⠀⠀⢀⣠⣶⡿⠛⠉⠀⠀⠀⠀⠀⣾⡇⠀⠀⠀⠀⠀⢸⣿⠇
// ⢀⣠⣾⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⢀⣼⣧⣀⠀⠀⠀⢀⣼⠇
// ⠈⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⡿⠋⠙⠛⠛⠛⠛⠛⠁
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⡿⠋⠀
// ⠀⠀⠀⠀⠀⠀⠀⠀⢾⠿⠋⠀

评论

2 条评论,欢迎与作者交流。

正在加载评论...