• 【BZOJ2957】—楼房重建(线段树维护单调序列)


    传送门

    发现如果左边比右边最高的高的话左边肯定右边的就没用了
    然后就是一个单调栈
    用线段树维护一下就可以了
    具体可以看代码

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    inline int read(){
        char ch=getchar();
        int res=0,f=1;
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
        return res*f;
    }
    const int N=100005;
    int ans[N<<2],n,m;
    double tr[N<<2];
    #define lc (u<<1)
    #define rc ((u<<1)|1)
    #define mid ((l+r)>>1)
    inline int query(int u,int l,int r,double k){
        if(l==r)return tr[u]>k;
        if(tr[lc]<=k)return query(rc,mid+1,r,k);
        else return ans[u]-ans[lc]+query(lc,l,mid,k);
    }
    inline void pushup(int u,int l,int r){
        tr[u]=max(tr[lc],tr[rc]);
        ans[u]=ans[lc]+query(rc,mid+1,r,tr[lc]);
    }
    inline void update(int u,int l,int r,int p,double k){
        if(l==r){tr[u]=k,ans[u]=1;return;}
        if(p<=mid)update(lc,l,mid,p,k);
        else update(rc,mid+1,r,p,k);
        pushup(u,l,r);
    }
    int main(){
        n=read(),m=read();
        for(int i=1;i<=m;i++){
            double x=read(),y=read();
            update(1,1,n,x,y/x);cout<<ans[1]<<'
    ';
        }
    }
    
  • 相关阅读:
    2021 3 11 结队博客
    第一周 2021.03.07
    2021 3 5 知识点总结
    2021 3 3 每日总结
    2021 3 2 新学期的第一篇博客
    十天冲刺09
    二阶段之四
    安卓开发之实现手机验证码登录
    安卓布局(三)
    安卓布局(二)
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145633.html
Copyright © 2020-2023  润新知