zoukankan      html  css  js  c++  java
  • BZOJ-4364: [IOI2014]wall砖墙 (线段树)

    4364: [IOI2014]wall砖墙

    Time Limit: 60 Sec  Memory Limit: 256 MB
    Submit: 262  Solved: 124
    [Submit][Status][Discuss]

    Description

    健佳正在用大小相同的砖块来砌起一面墙。这面墙由 列砖块所组成,它们从左到右的编号0至n-1。各列的高度可
    以不同。各列的高度就是该列砖块的数量。健佳用如下方式来建造这面墙。最开始每列都没有砖块。此后,健佳通
    过k个阶段的增加(adding)或移除(removing)砖块操作来砌墙。当所有k个阶段完成后,这面墙就砌好了。在每个阶
    段中,健佳都会被告知一个连续的砖块列的范围,以及一个高度值h,然后他就完成如下过程:在增加砖块(adding
    )阶段,对于给定的列范围中高度小于h的列,健佳会增加砖块使它们的高度都恰好等于h。此时他不会改变那些高
    度大于或等于h的列。在移除砖块(removing)阶段,对于给定的列范围中高度大于 的列,健佳会移除砖块使它们的
    高度都恰好等于h。此时他不会改变那些高度小于或等于h的列。你的任务就是计算出这面墙的最后形状。

    Input

    第1行:n, k。
    第2+i 行(0≤i≤k-1):op[i], left[i], right[i], height[i]。
    n: 这面墙中的列数。
    k: 阶段数。
    op: 大小为k的数组;op[i]是第i个阶段的类型:1 表示增加阶段(adding) 而 2表示移除阶段(removing) 
    其中0≤i≤k-1。
    left 和 right: 大小为k的数组;在第i个阶段中,列的范围从第left[i] 列开始到第right[i]列结束(包括两端
    left[i] 和 right[i]),其中0≤i≤k-1。这里保证满足left[i]≤right[i]。
    height: 大小为k的数组;height[i] 表示在阶段i的高度参数,其中0≤i≤k-1。

    Output

    共n行
    第i行包含一个整数表示finalHeight[i]。
    finalHeight: 大小为n的数组;你需要把第i列砖块的最终数量存放到finalHeight[i]中做为返回结果
    其中0≤i≤n-1。

    Sample Input

    输入样例1
    10 3
    1 3 4 91220
    1 5 9 48623
    2 3 5 39412

    输入样例2
    10 6
    1 1 8 4
    2 4 9 1
    2 3 6 5
    1 0 5 3
    1 2 2 5
    2 6 7 0

    Sample Output

    输出样例1
    0
    0
    0
    39412
    39412
    39412
    48623
    48623
    48623
    48623

    输出样例2
    3
    4
    5
    4
    3
    3
    0
    0
    1
    0

    HINT



    对于100%的数据,1≤n≤2,000,000,1≤k≤500,000。


    2016.6.17时限放至60s


    Source

    IOI的题Orz 线段树乱搞搞就行了,维护一个当前区间的最大值,维护一个当前区间的最小值即可
     1 #include "bits/stdc++.h"
     2 #define lson rt<<1,l,m
     3 #define rson rt<<1|1,m+1,r
     4 using namespace std;
     5 typedef long long LL;
     6 const int MAX=2e6+5;
     7 int n,m;
     8 int mn[MAX<<2],mx[MAX<<2];
     9 inline int read(){
    10     int an=0,x=1;char c=getchar();
    11     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
    12     while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
    13     return an*x;
    14 }
    15 void PushUp(int rt){
    16     mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
    17     mn[rt]=min(mn[rt<<1],mn[rt<<1|1]);
    18 }
    19 void PushDown(int rt){
    20     if (mn[rt]>mx[rt<<1]) mx[rt<<1]=mn[rt<<1]=mn[rt];
    21     else if (mn[rt]>mn[rt<<1]) mn[rt<<1]=mn[rt];
    22     if (mn[rt]>mx[rt<<1|1]) mx[rt<<1|1]=mn[rt<<1|1]=mn[rt];
    23     else if (mn[rt]>mn[rt<<1|1]) mn[rt<<1|1]=mn[rt];
    24     
    25     if (mx[rt]<mn[rt<<1]) mx[rt<<1]=mn[rt<<1]=mx[rt];
    26     else if (mx[rt]<mx[rt<<1]) mx[rt<<1]=mx[rt];
    27     if (mx[rt]<mn[rt<<1|1]) mx[rt<<1|1]=mn[rt<<1|1]=mx[rt];
    28     else if (mx[rt]<mx[rt<<1|1]) mx[rt<<1|1]=mx[rt];
    29 }
    30 void update1(int rt,int l,int r,int x,int y,int z){//调高
    31     if (x<=l && r<=y){
    32         mx[rt]=max(mx[rt],z);
    33         mn[rt]=max(mn[rt],z);
    34         return;
    35     }
    36     int m=(l+r)>>1;
    37     PushDown(rt);
    38     if (x<=m) update1(lson,x,y,z);
    39     if (y>m) update1(rson,x,y,z);
    40     PushUp(rt);
    41 }
    42 void update2(int rt,int l,int r,int x,int y,int z){//调低
    43     if (x<=l && r<=y){
    44         mx[rt]=min(mx[rt],z);
    45         mn[rt]=min(mn[rt],z);
    46         return;
    47     }
    48     int m=(l+r)>>1;
    49     PushDown(rt);
    50     if (x<=m) update2(lson,x,y,z);
    51     if (y>m) update2(rson,x,y,z);
    52     PushUp(rt);
    53 }
    54 int out(int rt,int l,int r){
    55     if (l==r) return printf("%d
    ",mx[rt]),0;
    56     int m=(l+r)>>1;
    57     PushDown(rt);
    58     out(lson);
    59     out(rson);
    60 }
    61 int main(){
    62     freopen ("wall.in","r",stdin);
    63     freopen ("wall.out","w",stdout);
    64     int i,j,x,y,z,w;
    65     n=read(),m=read();
    66     for (i=1;i<=m;i++){
    67         w=read(),x=read(),y=read(),z=read();++x,++y;
    68         if (w==1) update1(1,1,n,x,y,z);
    69         if (w==2) update2(1,1,n,x,y,z);
    70     }
    71     out(1,1,n);
    72     return 0;
    73 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    数据库创建标量值函数
    大并发大数据量请求的处理方法
    模态对话框 bootstrap-modal.js
    创建测试表,批量插入数据的存储过程,分页存储过程
    android:强大的图片下载和缓存库Picasso
    压缩图片链接
    Css3:transform变形
    css中 padding属性的数值赋予顺序为
    Css3颜色值RGBA得表示方式
    css3 box-shadow让我们实现图层阴影效果
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7705883.html
Copyright © 2011-2022 走看看