https://vjudge.net/problem/CodeForces-1291B
题目大意:给一个数组,
,你可以对任意
使得
。问经过若干次操作后,能否找到一个
,使得
且
。
思路:不妨先假设 ,也就是说 一定是单调上升的,那么根据贪心策略,该序列一定可以转换成最优序列: 。也就是说如果 ,则可以令 ,如果 ,说明出现了拐点,也就是说 必须要单调下降,所以有 ,如果出现了 则说明不符题意。那么 的情况怎么处理呢?我们可以用一个数组 , 是 的逆序表示,然后再用上述方法对 进行判断,如果可行就是满足题意的。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=3e5+5;
int n;
int a[2][maxn];
bool check(int id)
{
int idx=-1;
for(int i=0;i<n;i++)
{
if(a[id][i]>=i)
a[id][i]=i;
else
{
idx=i;
break;
}
}
if(idx==-1)
return 1;
bool flag=1;
for(int i=idx;i<n&&flag;i++)
{
if(a[id][i]>=a[id][i-1])
a[id][i]=a[id][i-1]-1;
if(a[id][i]<0)
flag=0;
}
return flag;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[0][i]);
for(int i=0;i<n;i++)
a[1][i]=a[0][n-i-1];
if(check(0)||check(1))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}