AtCoder Grand Contest 040 A

传送门

对于某个位置,只要知道这个位置往左最多的连续 $ ext{<}$ 的数量 $x$ 和往右最多的连续 $ ext{>}$ 的数量 $y$

那么这个位置最小可能的数即为 $max(x,y)$,首先这个值显然是下限,现在只要证明可以一定取到这个下限

考虑往左第一个左边是 $ ext{>}$ 右边是 $ ext{<}$ 的位置 $p$,那么 $p$ 的值一定可以为 $0$,并且 $p$ 到当前位置这一段都是 $ ext{<}$(一共有 $x$ 个 $ ext{<}$)

那么当只考虑左边的限制时,显然当前位置可以取到大于等于 $x$ 的值

然后右边也是同理,为了满足两边的限制取个 $max$ 即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=5e5+7;
int n,sl[N],sr[N];
ll ans;
char s[N];
int main()
{
    scanf("%s",s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='>') sl[i]=i;
        else sl[i]=sl[i-1];
    }
    sr[n]=n;
    for(int i=n-1;i>=0;i--)
    {
        if(s[i+1]=='<') sr[i]=i;
        else sr[i]=sr[i+1];
    }
    for(int i=0;i<=n;i++)
        ans+=max(i-sl[i],sr[i]-i);
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/LLTYYC/p/11791754.html