AtCoder Grand Contest 040 A - ><

传送门

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

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

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

那么当只考虑左边的限制时,显然当前位置可以取到大于等于 $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\n",ans);
    return 0;
}

 

posted @ 2019-11-04 14:07  LLTYYC  阅读(324)  评论(0编辑  收藏  举报