• [bzoj4364] [IOI2014]wall砖墙


    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。

    Solution

    orz吉司机论文

    线段树模板题

    记录下最大值次大值,最大值作为标记下传,如果当前要修改的最大值影响不到次大值就改下最大值,否则暴力dfs,复杂度(O(mlog^2 n)​),具体见2016年论文。

    #include<bits/stdc++.h>
    using namespace std;
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    const int maxn = 2e6+10;
    const int inf = 1e9;
    
    int n,m;
    
    #define ls p<<1
    #define rs p<<1|1
    #define mid ((l+r)>>1)
    
    struct Segment_Tree {
        int mn[maxn<<2],mx[maxn<<2],smx[maxn<<2],smn[maxn<<2];
        void update(int p) {
            if(mx[ls]==mx[rs]) mx[p]=mx[ls],smx[p]=max(smx[ls],smx[rs]);
            else if(mx[ls]>mx[rs]) mx[p]=mx[ls],smx[p]=max(smx[ls],mx[rs]);
            else mx[p]=mx[rs],smx[p]=max(smx[rs],mx[ls]);
            if(mn[ls]==mn[rs]) mn[p]=mn[ls],smn[p]=min(smn[ls],smn[rs]);
            else if(mn[ls]>mn[rs]) mn[p]=mn[rs],smn[p]=min(smn[rs],mn[ls]);
            else mn[p]=mn[ls],smn[p]=min(smn[ls],mn[rs]);
        }
        void build(int p,int l,int r) {
            if(l==r) return mn[p]=mx[p]=0,smn[p]=inf,smx[p]=-inf,void();
            build(ls,l,mid),build(rs,mid+1,r),update(p);
        }
        void push_max(int p,int x) {
            mx[p]=x;mn[p]=min(mn[p],x);
            if(mx[p]==mn[p]) smx[p]=-inf,smn[p]=inf;
            else smn[p]=min(smn[p],x);
        }
        void push_min(int p,int x) {
            mn[p]=x,mx[p]=max(mx[p],x);
            if(mx[p]==mn[p]) smx[p]=-inf,smn[p]=inf;
            else smx[p]=max(smx[p],x);
        }
        void pushdown(int p) {
            if(mx[ls]>mx[p]&&mx[p]>smx[ls]) push_max(ls,mx[p]);
            if(mx[rs]>mx[p]&&mx[p]>smx[rs]) push_max(rs,mx[p]);
            if(mn[ls]<mn[p]&&mn[p]<smn[ls]) push_min(ls,mn[p]);
            if(mn[rs]<mn[p]&&mn[p]<smn[rs]) push_min(rs,mn[p]);
        }
        void add(int p,int l,int r,int x,int y,int z) {
            if(mn[p]>=z) return ;
            if(x<=l&&r<=y&&z<smn[p]) return push_min(p,z),void();
            pushdown(p);
            if(x<=mid) add(ls,l,mid,x,y,z);
            if(y>mid) add(rs,mid+1,r,x,y,z);
            update(p);
        }
        void remove(int p,int l,int r,int x,int y,int z) {
            if(mx[p]<=z) return ;
            if(x<=l&&r<=y&&smx[p]<z) return push_max(p,z),void();
            pushdown(p);
            if(x<=mid) remove(ls,l,mid,x,y,z);
            if(y>mid) remove(rs,mid+1,r,x,y,z);
            update(p);
        }
        void print(int p,int l,int r) {
            if(l==r) return printf("%d
    ",mx[p]),void();
            pushdown(p);
            print(ls,l,mid),print(rs,mid+1,r);
        }
    }SGT;
    
    int main() {
        read(n),read(m);SGT.build(1,1,n);
        for(int op,x,y,z,i=1;i<=m;i++) {
            read(op),read(x),read(y),read(z);x++,y++;
            if(op==1) SGT.add(1,1,n,x,y,z);
            else SGT.remove(1,1,n,x,y,z);
        }
        SGT.print(1,1,n);
        return 0;
    }
    
  • 相关阅读:
    学会时刻总结
    JS银行卡号Luhm校验
    来京一年总结
    Linux内核同步机制 第1部分(转)
    Spinlock 简介(转)
    warning: no newline at end of file 解决(转)
    c语言 关键字 extern(转)
    MFC 线程同步(转)
    C语言 全局变量 初始化
    Linux 内核的同步机制,第 2 部分
  • 原文地址:https://www.cnblogs.com/hbyer/p/10228432.html
Copyright © 2020-2023  润新知