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; }