• SKYLINE


    uvalive4108:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2109

    题意:按照顺序建造一些矩形的房屋,房屋是二维的,每个房屋起点,终点,以及高度给出,然后问你在建造的过程中,所有在建造时候没有被覆盖房屋长度之和。

    题解:显然,题目扥意思就是在建造房屋i的时候,在区间x1---x2 之间,比y小或者等于的距离长度。这里就可以用线段树维护。但是要注意,对于此题,要用lazy标记。

    lazy==1表示该区间已经被完全覆盖。那么某区间更新的条件就是,1该区间是被完全覆盖的区间,只有一个区间内高度是一致的,才能进行接下来的判断2就是该区间的高度要小于要更新的区间,如果小于则更新,否则直接return。如果不满足条件1,则pushdown();因为只有当lazy==1才被更新,所以这一题在更新的时候不用做标记。lazy的变化,是在pushdown()里面。还有一个重要的地方就是,本题更新的是线段,要处理这个这个问题,别人的做法就是把右端点-1,其实,想想也是有道理的。还有查询的时候,有点变化,可以把更新直接放在查询里面。只要改区间是完全覆盖的,并且要查询的区间在这个范围内,且小于y值,可以直接返回结果,如果大于,直接返回0,如果区间不是完全覆盖,则pushdown。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 const int N=100002;
     7 
     8 struct Segtree{
     9    int l,r;
    10    int mul,lazy;
    11    inline int mid(){
    12       return (l+r)/2;
    13    }
    14 }num[N*4];
    15 void build(int rt,int l,int r){
    16     num[rt].l=l;
    17     num[rt].r=r;
    18     num[rt].mul=0;
    19     num[rt].lazy=1;
    20     if(l==r)
    21         return;
    22     int mid=num[rt].mid();
    23     build(rt<<1,l,mid);
    24     build(rt<<1|1,mid+1,r);
    25 }
    26 
    27 void pushdown(int rt){
    28   if(num[rt].lazy==1){
    29     num[rt<<1].mul=num[rt].mul;
    30     num[rt<<1|1].mul=num[rt].mul;
    31     num[rt].lazy=0;
    32   }
    33 }
    34 void update(int rt,int l,int r,int val){
    35     if(num[rt].l==l&&num[rt].r==r&&num[rt].lazy==1){
    36         if(num[rt].mul<val)
    37             num[rt].mul=val;
    38             return;
    39     }
    40      pushdown(rt);
    41     int mid=num[rt].mid();
    42     if(mid>=r)update(rt<<1,l,r,val);
    43     else if(mid<l)update(rt<<1|1,l,r,val);
    44     else{
    45         update(rt<<1,l,mid,val);
    46         update(rt<<1|1,mid+1,r,val);
    47     }
    48 }
    49 int query(int rt,int l,int r,int val){
    50     if(num[rt].lazy==1){
    51         if(num[rt].mul<=val){
    52            update(rt,l,r,val);
    53             return r-l+1;
    54         }
    55         else return 0;
    56     }
    57     pushdown(rt);
    58     int mid=num[rt].mid();
    59     if(mid>=r)return query(rt<<1,l,r,val);
    60     else if(mid<l)return query(rt<<1|1,l,r,val);
    61     else{
    62         return query(rt<<1,l,mid,val)+query(rt<<1|1,mid+1,r,val);
    63     }
    64 }
    65 int n;
    66 int main(){
    67     int cas,t1,t2,t3;
    68     scanf("%d",&cas);
    69     while(cas--){
    70       scanf("%d",&n);
    71        build(1,1,100000);
    72       int ans=0;
    73       for(int i=1;i<=n;i++){
    74         scanf("%d%d%d",&t1,&t2,&t3);
    75         ans+=query(1,t1,t2-1,t3);
    76       }
    77       printf("%d
    ",ans);
    78      // scanf("%d",&t1);
    79     }
    80 }
    View Code
  • 相关阅读:
    Andriod 简介
    Java 记录日志
    Java 国际化
    Java 正则表达式的使用
    Java 日期、时间类,日期、时间的格式化
    Java Random类、ThreadLocalRandom类
    Java Math类、BigDecimal类、NumberFormat类、浮点数的精确度问题
    Java String类、StringBuilder类、StringBuffer类
    Java System类、RunTime类、Object类、垃圾回收
    span 右浮动折行 解决ie6/7中span右浮动折行问题
  • 原文地址:https://www.cnblogs.com/chujian123/p/3841564.html
Copyright © 2020-2023  润新知