• poj 3277 City Horizon 夜


    http://poj.org/problem?id=3277

    经典的矩形面积并  对y离散后 建树 用拆点后的以x为顺序  依次更新

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<ctime>
    #include<queue>
    #include<cstring>
    #include<set>
    #include<cmath>
    #include<algorithm>
    #define LL long long
    using namespace std;
    
    const int N=40005;
    struct node
    {
        int l,r;
        LL H;//这个高度主要是用来查找的
        LL h;//这一段的最高度
        int cover;//被覆盖次数
    }mem[N*4];
    LL Y[N*2];//高度
    struct poin
    {
        int k;
        LL x;
        LL h;
    }point[N*2];//拆点 k 表示左点 还是右点
    bool cmp(poin a,poin b)
    {
        if(a.x==b.x)
        return a.h<b.h;
        return a.x<b.x;
    }
    LL Labs(LL x)
    {
        if(x<0)
        return -x;
        return x;
    }
    LL Lmax(LL x,LL y)
    {
        if(x>y)
        return x;
        return y;
    }
    void build(int x,int l,int r)
    {
        mem[x].cover=0;
        mem[x].l=l;
        mem[x].r=r;
        mem[x].h=0;
        if(l==r)
        {
            mem[x].H=Y[l];
            return ;
        }
        int mid=(l+r)>>1;
        build(x*2,l,mid);
        build(x*2+1,mid+1,r);
        mem[x].H=Lmax(mem[x*2].H,mem[x*2+1].H);//更新最高度
    }
    void add(int x,int k)
    {
        if(mem[x].l==mem[x].r)
        {
            mem[x].cover+=point[k].k;//更新cover
            if(mem[x].cover>0)//大于0 为有覆盖 所以高度为 H 否则为0
            mem[x].h=mem[x].H;
            else
            mem[x].h=0;
            return ;
        }
        if(Labs(point[k].h)<=mem[x*2].H)
        add(x*2,k);
        else
        add(x*2+1,k);
        mem[x].h=Lmax(mem[x*2].h,mem[x*2+1].h);//更新
    }
    int main()
    {
       // freopen("data.txt","r",stdin);
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=0;i<n;++i)
            {
                scanf("%I64d %I64d %I64d",&point[i].x,&point[i+n].x,&point[i].h);
                point[i+n].h=point[i].h;
                point[i].k=1;
                point[i+n].k=-1;
                Y[i]=point[i].h;
            }
            sort(Y,Y+n);
            sort(point,point+n*2,cmp);
            build(1,0,n-1);//对排序后的高度进行建树
            add(1,0);
            LL ans=0;
            for(int i=1;i<2*n;++i)
            {
                ans+=(point[i].x-point[i-1].x)*mem[1].h;//更新面积
                add(1,i);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    xml的schema约束(Java)
    simpleXML技术解析xml文件(php)
    xpath技术解析xm文件(php)
    提升树AdaBoost算法【自适应增强算法(集成学习算法)】
    岭回归与Lasso回归模型
    机器学习--线性回归模型
    Centos7下如何安装Python3.7以及java JDK?
    Python3的map、filter与reduce函数
    Python函数
    Win10下解决matplotlib中文乱码-亲测有效
  • 原文地址:https://www.cnblogs.com/liulangye/p/2618510.html
Copyright © 2020-2023  润新知