D. Let's Go Hiking

Codeforces Round #706 (Div. 2)

首先保证x落点峰顶

然后讨论最长上升或下降那一段的情况(否则,y走比x长的段就能赢)

讨论升降长度相等 不等 各自的奇数长度、偶数长度的情况

发现只有最长升降那段,升长等于降长且长度都为奇数才能输出1

其他情况输出0

讨论结束

赛后才会做,代码明天上课写

菜死了=  =

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define MAX 1000001
const ll N = 2e5+7;
const ll mod = 1e9+7;
using namespace std;
ll n,L[N],R[N],a[N];//L升  R降 
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;++i)    scanf("%lld",&a[i]);
    //求各段升的长度 
    L[1]=1; 
    for(int i=2;i<=n;++i){
        if(a[i]>a[i-1])    L[i]=L[i-1]+1;
        else            L[i]=1;
    }
    //求各段降的长度 
    R[n]=1; 
    for(int i=n-1;i>=1;--i){
        if(a[i]>a[i+1])    R[i]=R[i+1]+1;
        else            R[i]=1;
    }
    //找出最长段长度
    ll maxx=-1;
    for(int i=1;i<=n;++i){
        maxx=max(maxx,max(L[i],R[i]));
    }
    //
    int flag=0,cnt=0,pos=0;
    for(int i=1;i<=n;++i){
        if(maxx==L[i]&&maxx==R[i])    cnt++;//峰左右都为最长段 只记一次 
        else if(maxx==L[i])    cnt++;    //记录最长段个数 
        else if(maxx==R[i])    cnt++;
        
        if(pos==0){
            if(L[i]==maxx||R[i]==maxx)    pos=i;
        }
    }
    if(cnt>1){
        flag=0;
    }
    else{
        if(L[pos]==R[pos]&&L[pos]%2==1)    flag=1;
    }
    if(flag)    printf("1
");
    else        printf("0
");
    return 0;   
}
View Code
原文地址:https://www.cnblogs.com/PdrEam/p/14514965.html