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\n");
    else        printf("0\n");
    return 0;   
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM