CF1671B solution

Problem

给定序列 \(\{a_n\}\),对于每个 \(a_i\) 你可以将他变成 \(a_i-1\)\(a_i\)\(a_i+1\),是否有一种操作方法可以使该序列满足对于任意一个 \(i(1<i\le n)\) 满足 \(a_i=a_{i-1}+1\)

link->https://codeforces.com/contest/1671/problem/B

Solution

如果我们确定了 \(a_1\) 的值,则最终序列的每个 \(a_i=a_1+i-1\)

则问题变成了:给定序列 \(\{a_n\}\) 是否可以将每个 \(a_i\) 变成 \(a_1+i-1\)

显而易见,最终 \(a_i\) 的值只有可能是(最初的)\(a_1-1\)\(a_i\)\(a_i+1\)

\(a_i\) 分别取 \(a_i-1\)\(a_i\)\(a_i+1\),只要有一种满足条件(可以构造出题目要求的序列)即可。

Code

#include<bits/stdc++.h>
#define pd push_back
#define pb pop_back
#define mk make_pair
//#define int long long
#define PII pair<int,int>
#define _for(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
#define _go(i,u) for(int i=head[u];i;i=Edge[i].nxt)
using namespace std;
namespace I {
	template <typename T> void read(T& x) {
		x=0; T f=1; char ch=getchar();
		while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
		while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch&15); ch=getchar(); }
		x=x*f; return;
	}
	template <typename T,typename ...Arg> void read(T& x,Arg& ...arg) {
		read(x); read(arg...);
	}
}
namespace Math {
	template <typename T> T power(T a,T b,T MOD) {
		T ans=1; while(b) { if(b&1) ans=ans*a%MOD; a=a*a%MOD; b>>=1; } return ans%MOD;
	}
	template <typename T> T gcd(T a,T b) {
		if(b) return gcd(b,a%b); return a;
	}
	template <typename T> T lcm(T a,T b) {
		return a/gcd(a,b)*b;
	}
	template <typename T> T inv(T n,T p) {
		return power(n,p-2);
	}
	const int Test[]={0,2,3,5,7,11,13,17,19,23,29};
	template <typename T> bool is_prime(T n) {
		if(n<2) return 0;
		T t=n-1,k=0; while((t+1)&1) ++k,t>>=1;
		_for(i,1,10) {
		    if(n==Test[i]) return 1;
		    T s=power(Test[i],t,n); T tmp=s;
		    _for(j,1,k) {
		        tmp=s*s%n; if(tmp==1&&s!=1&&s!=n-1) return 0; s=tmp;
		    }
		    if(s!=1) return 0;
		}
		return 1;
	}
}
const int N=2e5+5;
int a[N],tmp[N],n,T;
bool Solve(int p) { //判断我们将a[1]设为a[1]+p时是否可行
	_for(i,1,n) a[i]=tmp[i];
	a[1]+=p;
	_for(i,2,n)
		if(a[i]-a[i-1]<0||a[i]-a[i-1]>2)
			return false;
		else
			a[i]=a[i-1]+1;
	return true;
}
signed main() {
	I::read(T);
	while(T--) {
		I::read(n);
		_for(i,1,n)
			I::read(tmp[i]);
		puts(Solve(-1)||Solve(0)||Solve(1)? "YES":"NO");
	}
	return 1;
}

posted @ 2022-08-01 12:09  lsj2009  阅读(29)  评论(0)    收藏  举报