zoukankan      html  css  js  c++  java
  • bzoj2957 楼房重建——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957

    线段树维护两个值:cnt 能看到的最多楼房数; mx 最大斜率数;

    对于一段区间,从左子区间的角度出发来限制右子区间,得到总区间的 cnt 和 mx;

    转移时关注新斜率和左右子区间最大斜率的关系即可。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int const maxn=100005;
    int n,m,cnt[maxn<<2];
    double mx[maxn<<2];
    int query(double d,int o,int l,int r)
    {
        int ls=(o<<1),rs=(o<<1|1),mid=(l+r)>>1;
        if(l==r)return d<mx[o];
        if(d>mx[ls])return query(d,rs,mid+1,r);
        else return cnt[o]-cnt[ls]+query(d,ls,l,mid);
    }
    void update(double d,int p,int o,int l,int r)
    {
        if(l==r)
        {
            cnt[o]=1; mx[o]=d; return;
        }
        int mid=(l+r)>>1;
        if(p<=mid)update(d,p,o<<1,l,mid);
        else update(d,p,o<<1|1,mid+1,r);
        mx[o]=max(mx[o<<1],mx[o<<1|1]);
    //    cnt[o]=query(mx[o],o,l,r);
        cnt[o]=cnt[o<<1]+query(mx[o<<1],o<<1|1,mid+1,r);//右区间受左区间限制 
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1,x,y;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            update((double)y/x,x,1,1,n);
            printf("%d
    ",cnt[1]);
        }
        return 0;
    }
  • 相关阅读:
    c#中的as,is和强转
    Shader中的lerp
    [RequireComponent(typeof(....))]
    [ExecuteInEditMode]
    在ugui上显示3d物体
    T4语法快速入门
    MVC生命周期
    MVC5路由系统机制详细讲解
    FluentScheduler定时器计划任务
    MVC的WebViewPage
  • 原文地址:https://www.cnblogs.com/Zinn/p/9202573.html
Copyright © 2011-2022 走看看