1 条题解

  • 0
    @ 2023-5-16 21:21:41
    // luogu-judger-enable-o2
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    const int inf=1<<30;
    long long  top;
    struct Pool
    {
        long long w;
        long long h;
        long long id;
        Pool(long long ww=0,long long hh=0, long long _id=0):w(ww),h(hh),id(_id){};
    }pool[maxn],struck[maxn];
    long long n,m;
    long long ans[maxn];
    long long now;
    inline long long  read(){
        register long long  x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return (f==1)?x:-x;
    }
    int main()
    {
        long long temp=inf,id;
        n=read();
        for(int i=1;i<=n;i++)
        {
            pool[i].w=read();
            pool[i].h=read();
            pool[i].id=i;
            if(temp>pool[i].h)
            {
                temp=pool[i].h;
                id=i;
            }
        }
        struck[++top]=pool[id];
        struck[0].h=inf;
        long long l=id;
        long long r=id;
        long long p;
        pool[0].h=pool[n+1].h=inf;
        for(int i=1;i<=n;i++)
        {
            long long add=0;
            if(pool[l-1].h<pool[r+1].h)
            {
                p=--l;
            }
            else
            {
                p=++r;
            }
            while(pool[p].h>struck[top].h&&top)
            {
                struck[top].w+=add;
                ans[struck[top].id]=now+struck[top].w;
                now+=struck[top].w*(min(pool[p].h,struck[top-1].h)-struck[top].h);
                add=struck[top].w;
                top--;
            }
            pool[p].w+=add;
            struck[++top]=pool[p];
        }
        for(int i=1;i<=n;i++)
        {
            printf("%lld\n",ans[i]);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2419
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者