思路:A要赢的大前提就是当前x是一个波峰。

因为如果是一个直线单调的话如1 2 3 4 5(或者5 4 3 2 1),不管A选哪个位置,B直接在他下一个位置封死,A就直接GG。

现在考虑波峰的时候,那A就有两条路可以走,走左边或者走右边都可以(这个时候B就不能直接封死A了)。但是如果B能在别的地方挑一条比这两条路还长的路,那A还是输。当B选不到更长的路的时候,就会尽量的恶心A,走两条路中较长的那一条,这个时候A走较短的话必输,所以AB这时候必须相向而行。这个时候这条路的长度是奇数的话A就能赢了,且是唯一的一种赢法。

看看图解吧。

view code
    #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} }; ll n;
ll a[maxn];
ll dp[maxn][2]; int main()
{
n = read();
rep(i,1,n) a[i] = read();
dp[1][0] = dp[n][1] = 1;
map<ll,ll> cnt1;
map<ll,ll> cnt2;
ll ma = 0;
rep(i,2,n)
{
if(a[i]>a[i-1]) dp[i][0] = dp[i-1][0] + 1;
else dp[i][0] = 1;
}
per(i,n-1,1)
{
if(a[i]>a[i+1]) dp[i][1] = dp[i+1][1] + 1;
else dp[i][1] = 1;
}
rep(i,1,n)
{
cnt1[dp[i][0]]++;
cnt2[dp[i][1]]++;
ma = max(ma,max(dp[i][0],dp[i][1]));
}
ll ans = 0;
rep(i,1,n)
{
if(dp[i][0]==1||dp[i][1]==1) continue;
ll ma1 = max(dp[i][0], dp[i][1]);
ll mi1 = min(dp[i][0],dp[i][1]);
if(ma>ma1||ma==ma1&&(cnt1[ma]>1||cnt2[ma]>1)||(ma==ma1&&(cnt1[ma]==1&&cnt2[ma]==1&&ma%2==0)) ) continue;
if(ma1-mi1<=0) ans++;
}
cout<<ans<<endl;
return 0;
}

Codeforces Round #706 (Div. 2) D. Let's Go Hiking 博弈 思维的更多相关文章

  1. Codeforces Round #184 (Div. 2) E. Playing with String(博弈)

    题目大意 两个人轮流在一个字符串上删掉一个字符,没有字符可删的人输掉游戏 删字符的规则如下: 1. 每次从一个字符串中选取一个字符,它是一个长度至少为 3 的奇回文串的中心 2. 删掉该字符,同时,他 ...

  2. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)

    Codeforces Round #529 (Div. 3) 题目传送门 题意: 给你由左右括号组成的字符串,问你有多少处括号翻转过来是合法的序列 思路: 这么考虑: 如果是左括号 1)整个序列左括号 ...

  3. Codeforces Round #706 (Div. 2)B. Max and Mex __ 思维, 模拟

    传送门 https://codeforces.com/contest/1496/problem/B 题目 Example input 5 4 1 0 1 3 4 3 1 0 1 4 3 0 0 1 4 ...

  4. Codeforces Round #228 (Div. 1) C. Fox and Card Game 博弈

    C. Fox and Card Game 题目连接: http://codeforces.com/contest/388/problem/C Description Fox Ciel is playi ...

  5. Codeforces Round #509 (Div. 2) F. Ray in the tube(思维)

    题目链接:http://codeforces.com/contest/1041/problem/F 题意:给出一根无限长的管子,在二维坐标上表示为y1 <= y <= y2,其中 y1 上 ...

  6. Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维

    原题链接https://codeforces.com/contest/1486/problem/B 题目 解题思路 这是个思维题,  算是货仓选址的变式, 想要到达各个点距离最小,我们的目标可以化为先 ...

  7. Codeforces Round #553 (Div. 2)B. Dima and a Bad XOR 思维构造+异或警告

    题意: 给出一个矩阵n(<=500)*m(<=500)每一行任选一个数 异或在一起 求一个 异或在一起不为0 的每行的取值列号 思路: 异或的性质  交换律 x1^x2^x3==x3^x2 ...

  8. Codeforces Round #512 (Div. 2) D. Vasya and Triangle(几何+思维)

    题目 题意: 给出 n,m,k ,让你在长为 n,宽为 m 的坐标系里构建一个三角形,使得面积= n*m/k.如果存在,输出“YES”,输出三角形三个顶点的坐标:  如果不存在,输出“NO”. 思路: ...

  9. Codeforces Round #600 (Div. 2) D题【并查集+思维】

    题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...

  10. Codeforces Round #573 (Div. 2) E. Tokitsukaze and Duel (博弈)

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

随机推荐

  1. Ruby+Appium+testunit实现app自动化demo

    1.安装对应库 gem install test-unit gem install appium_lib 2.编写代码 代码如下: require 'appium_lib' require 'test ...

  2. @PathVaribale

    /** * @pathVaribale * 作用: 用于获取url 中的占位符的值. * 例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符. * url 支持占位符是 ...

  3. C#使用Blazor编译WebAssembly供前端调用(一),关于SkiaSharp相关问题

    目前信创热潮开始掀起,而C#很多行业开发的都是桌面端,迁移到网页端常常会因为很多库不支持或者不友好导致项目一直卡着. 最近一直在网上找灵感,偶然发现Web Assembly,一开始我还没不知道这是什么 ...

  4. <HarmonyOS第一课04>应用程序框架基础

    视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497122909477?ha_sou ...

  5. 牛逼,这款开源聊天应用竟能一键召唤多个AI助手,跨平台通话神器!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 JiwuChat是一款基于Tauri2和Nuxt3构建的轻量化多平台即时通讯工具,仅约8MB ...

  6. Sentinel——热点规则

    目录 热点规则 配置热点规则 API配置热点规则 热点规则 热点规则是用于实现热点参数限流的规则.热点参数限流指的是,在流控规则中指定对某方法参数的 QPS 限流后,当所有对该资源的请求URL中携带有 ...

  7. 设计模式之“状态模式(State)”(未完整)

    一.状态模式(State) 状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 二.状态模式的作用 状态模式主要解决的是当控制一个对象状态转换条件表达式过于复杂时的情况. ...

  8. DOM基础操作小结

    最近一个多月都在看看前端的内容. 因为这半年都在做BI嘛, 感觉有些东西呀, 还是用前端来做会更加能满足客户的需求, 于是呢, 就网上找了一些资料, 学习了一波前端基础. 这里也是做个简单的笔记, 关 ...

  9. hashlib标准库简单使用

    哈希算法/摘要算法是通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示). 该库对于不同的哈希算法/摘要算法都提供了通用的接口,比如FIPS算法中的SHA1,SHA2 ...

  10. 【实战】深入浅出 Rust 并发:RwLock 与 Mutex 在 Tauri 项目中的实践

    引言 你是否遇到过 Rust 并发场景下的资源竞争.性能瓶颈? 当多个线程同时抓取网页导致 IP 被封.多线程读写本地数据引发一致性问题时,如何优雅地实现线程安全? 本文结合开源项目 Saga Rea ...