CF1495B

· · 题解

题目大意:

有两个人,他们在一张高度不一的图像吗行走, Q 只能向下走, D 只能向上走,不能走到别的人身上,求 Q 有多少中可以赢的位置。

大体思路:

这道题目就是分情况讨论, 我们先考虑 Q 怎么会输:

一种是这样:D 把 Q 的路堵住了

这时该 Q 走,我们可以发现他无路可走了,因为再下一格就是 D。 我们可以发现这种情况只会发生在这个坡是偶数长度的情况下。

一种是这样:Q 走到尽头了,但是 D 还能走:

这样 Q 就走不了了, 这种情况只会发生在两边边长不一的情况下。

我们再考虑 Q 会赢的情况:

一种是 Q 把 D 堵住了:

这时是 D 走,但他走不了了,所以他输了。 这时坡长是奇数。

那么这时 D 有办法吗? 当然有!

D 往上选一格,照样能堵住 Q。

那怎么办呢? 我们考虑其他的情况。

如果两边是一样长的,那么 Q 就往另一边走,D 走到顶上,Q 还没到底。

这貌似是一组正解,但考虑如果旁边有更长的坡:

这样 Q 到头了 D 还没有,如果 Q 选在红线上,D 照样堵他,妥妥的。

那怎么办呢?

考虑这种情况,两条最长的坡连在一起了:

这样也有两种情况:

首先考虑坡是偶数,这样 Q 不能往 D 的方向走,否则 D 会把他堵住。如果 Q 往另一边走,他会比 D 先到,所以这样也是输。

如果坡是奇数呢?

这样 Q 也不能往没有 D 的方向走,要不然他又会输。

如果 Q 往 D 的方向走呢?

那么这样 Q 把 D 堵住了,Q 就赢了。

那么 D 有办法吗? D 可不可以在往上一格?

尝试一下:

这样 D 到头了 Q 还没有。 还是 Q 赢。

这时他能赢的唯一情况,总结一下:有且只有两条最长的边,刚好连在一起,长度又恰好是奇数。

这题就做完了。

code:

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=100010;
int n,a[maxn],len_up,len_down;
int dp1[maxn],dp2[maxn],len_max;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>a[i-1]) dp1[i]=dp1[i-1]+1;
        else dp1[i]=1;
        if(a[i]<a[i-1]) dp2[i]=dp2[i-1]+1;
        else dp2[i]=1;//记录坡的连续长度 
        len_up=max(len_up,dp1[i]);
        len_down=max(len_up,dp2[i]);//记录最长的坡 
    }
    len_max=max(len_up,len_down);//最最长的坡 
    bool f_up=false,f_down=false;
    int p_up,p_down;
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(dp1[i]==len_max){
            f_up=true;
            cnt++;
            p_up=i;
        }
        if(dp2[i]==len_max){
            f_down=true;
            cnt++;
            p_down=i;
        } //记录最长的上坡和最长的下坡的位置 
    }
    if(f_up&&f_down&&cnt==2&&p_up==p_down-len_max+1&&len_max%2) cout<<1<<endl; 
    else cout<<0<<endl; 
    //判断,输出答案。 
    return 0;
}