zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    网站运维之 优化
    网站运维之 风险防控
    网站运维之 使用IIS日志分析器1.03.exe进行IIS服务器日志分析
    MySQL数据库优化
    深入理解Java GC
    深入理解React虚拟DOM
    深入理解new String()
    深入理解JVM内存模型
    MySQL的四种事务隔离级别
    Node.js Stream(流)
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11791754.html
Copyright © 2011-2022 走看看