题目翻译

输入一个长度为 $n$ 个数字,还有 $X$ 和 $Y$。
问数组中有几个区间最大值是 $X$ 且最小值是 $Y$。

题目思路

所有数字分为 $a_i>Y$,$a_i=Y$,$a_i<X$,$a_i=X$,$X<a_i<Y$ 五种情况。
$>Y$ 和 $<X$ 的位置一定不能选。
选一个区间,包含至少一个 $=Y$,包含至少一个 $=X$,问有多少种方案。
问以每个位置作为结尾,有多少个方案。
对于每个位置,找自己之前的最近的 $X$ 是多少,最近的 $Y$ 是多少,至多选多少个数字没有 $>Y$ 和 $<X$ 的情况。

主要代码

void solve()
{
    int n,x,y,maxxid=0,minnid=0,la=1;
    long long ans=0;
    cin>>n>>x>>y;
    for(int i=1;i<=n;i++)
    {
        int z;
        cin>>z;
        if(z==x)
        {
            maxxid=i;
        }
        if(z==y)
        {
            minnid=i;
        }
        if(z>x||z<y)
        {
            maxxid=0;
            minnid=0;
            la=i+1;
        }
        if(maxxid!=0&&minnid!=0)
        {
            ans+=min(maxxid,minnid)-la+1;
        }
    }
    cout<<ans<<endl;
}
最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四