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