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