当前位置: 首页 > news >正文

UVALive 4108 - SKYLINE(线段树区间更新)

题目链接 https://cn.vjudge.net/problem/UVALive-4108

【题意】
在地平线上依次建造n座建筑物,建筑物的修建按照从后往前的顺序,新建筑物可能会挡住一些老建筑物。在修建完一座建筑物后,统计它在多长的部分是最高的(可以和其他建筑物并列最高),把这个长度称为该建筑的“覆盖度”

【输入格式】
多组输入,第一行为数据组数。每组数据第一行为建筑物个数n(1<=n<=1e5)以下n行按照先后顺序给出n座建筑物的的左右边界和高度l,r,h(0 < l < r < 1e5,0 < h<=1e9)

【输出格式】
对每组数据,输出所有建筑物的总覆盖度

【思路】
对整个区间建立一个线段树,维护最大值和最小值,在每次更新的时候,如果当前区间的最小值比建筑物的高度还大,那么就不用更新区间的值了,如果当前区间的最大值小于等于建筑物高度,那么答案就要加上这一段区间的长度,并把这段区间更新成建筑物的高度

#include<bits/stdc++.h>
#define node tree[id]
#define lson tree[id<<1]
#define rson tree[id<<1|1]
using namespace std;

const int maxn=100050;

int n;
struct Tree{
    int left,right;
    int maxv,minv,lazy;
}tree[maxn<<2];

void pushup(int id){
    node.maxv=max(lson.maxv,rson.maxv);
    node.minv=min(lson.minv,rson.minv);
}

void pushdown(int id){
    if(node.lazy && node.left!=node.right){
        lson.lazy=node.lazy;
        lson.maxv=lson.minv=node.lazy;
        rson.lazy=node.lazy;
        rson.maxv=rson.minv=node.lazy;
        node.lazy=0;
    }
}

void build(int id,int le,int ri){
    node.left=le;
    node.right=ri;
    node.lazy=0;
    node.maxv=node.minv=0;
    if(le==ri) return;
    int mid=(le+ri)>>1;
    build(id<<1,le,mid);
    build(id<<1|1,mid+1,ri);
}

int update(int id,int le,int ri,int val){
    if(node.left==le && node.right==ri && node.minv>val) return 0;
    if(node.left==le && node.right==ri && node.maxv<=val){
        if(node.maxv<val){
            node.lazy=val;
            node.maxv=node.minv=val;
        }
        return ri-le+1;
    }
    pushdown(id);
    int ans=0;
    int mid=(node.left+node.right)>>1;
    if(ri<=mid) ans=update(id<<1,le,ri,val);
    else if(le>mid) ans=update(id<<1|1,le,ri,val);
    else ans=update(id<<1,le,mid,val)+update(id<<1|1,mid+1,ri,val);
    pushup(id);
    return ans;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int ans=0;
        build(1,1,100000);
        scanf("%d",&n);
        for(int i=0;i<n;++i){
            int x,y,h;
            scanf("%d%d%d",&x,&y,&h);
            ans+=update(1,x,y-1,h);
        }
        printf("%d\n",ans);
    }
    scanf("%d",&T);
    return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465265.html

相关文章:

  • PDO和MySQLi区别和数度;到底用哪个?
  • android 换行符(\n) 在TextView中显示不正常的问题
  • App上线-Missing App Store Icon
  • Windows 环境Oracle客户端下载安装
  • datetime模块的简单用法
  • JVM 内存解析,以及自己的一些见解
  • 对CRC32的小结加上bugku一道题目:好多压缩包
  • Excel-DNA自定义函数的参数智能提示功能:ExcelDna.IntelliSense1.1.0.rar
  • D05——C语言基础学PYTHON
  • 常见HTTP状态码
  • 蓝牙学习(4) -- L2CAP
  • c#窗体项目:工艺注意事项
  • Linux 常用命令——文件处理命令
  • python 爬虫 5i5j房屋信息 获取并存储到数据库
  • HDU - 2255 奔小康赚大钱 KM算法 模板题
  • 07.Android之多媒体问题
  • git 常用命令
  • Go 语言编译器的 //go: 详解
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Laravel核心解读--Facades
  • Python socket服务器端、客户端传送信息
  • Sass 快速入门教程
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • win10下安装mysql5.7
  • 关于List、List?、ListObject的区别
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 漂亮刷新控件-iOS
  • 前嗅ForeSpider中数据浏览界面介绍
  • 异步
  • hi-nginx-1.3.4编译安装
  • postgresql行列转换函数
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • $.ajax,axios,fetch三种ajax请求的区别
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计大学生兼职系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(一):@echo off
  • .form文件_SSM框架文件上传篇
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net FrameWork总结
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net 知识杂记
  • .NET轻量级ORM组件Dapper葵花宝典
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20150904]exp slow.txt
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误