• 【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]<<'
    ';
        }
    }
    
  • 相关阅读:
    c#中枚举的使用
    WEB页面下载内容导出excel
    浏览器使用说明
    ChromiumWebBrowser 禁用右键菜单
    ExpressionHelp2
    安装T4环境
    打印功能
    操作图片
    软件开发中的框架概念和技术路线概念
    Grpc-Client引用Server的proto文件时Build Fail
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145633.html
Copyright © 2020-2023  润新知