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