zoukankan      html  css  js  c++  java
  • UOJ #25. 【IOI2014】Wall 线段树

    一眼吉司机线段树弱化版,但是这道题可以不用这么高级的数据结构.   

    直接用普通线段树,打一个 mx,mn 标记分别表示区间取 mn,max 然后 pushdown 的时候讨论一下大小关系即可. 

    code:  

    #include <bits/stdc++.h>      
    #include "wall.h"
    #define lson x<<1 
    #define rson x<<1|1  
    #define N 2000006 
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;   
    const int inf=1000000000;   
    int mn[N<<2],mx[N<<2],A[N];          
    void init() 
    {       
        for(int i=0;i<(N<<2);++i)
            mn[i]=0,mx[i]=inf; 
    }       
    void mark_min(int x,int v) 
    {    
        mn[x]=max(mn[x],v);    
        mx[x]=max(mx[x],mn[x]);     
    }    
    void mark_max(int x,int v) 
    {
        mx[x]=min(mx[x],v);      
        mn[x]=min(mn[x],mx[x]);    
    }  
    void pushdown(int x) 
    {
        mark_min(lson,mn[x]); 
        mark_min(rson,mn[x]); 
        mark_max(lson,mx[x]);  
        mark_max(rson,mx[x]);   
        mn[x]=0,mx[x]=inf;    
    }
    void update(int l,int r,int x,int L,int R,int flag,int p) 
    {
        if(l>=L&&r<=R) 
        {
            if(flag==0) 
                mark_min(x,p);   
            else mark_max(x,p); 
            return; 
        }
        pushdown(x); 
        int mid=(l+r)>>1;    
        if(L<=mid)  update(l,mid,lson,L,R,flag,p); 
        if(R>mid)   update(mid+1,r,rson,L,R,flag,p); 
    }
    void query(int l,int r,int x,int *a) 
    {
        if(l==r)
        {
            a[l-1]=mn[x];       
            return; 
        } 
        pushdown(x); 
        int mid=(l+r)>>1;   
        query(l,mid,lson,a),query(mid+1,r,rson,a);  
    } 
    void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) 
    {
        init();       
        int m=k; 
        for(int i=0;i<m;++i) 
        {
            int l=left[i]+1,r=right[i]+1;     
            if(op[i]==1)  update(1,n,1,l,r,0,height[i]);  
            if(op[i]==2)  update(1,n,1,l,r,1,height[i]);    
        }
        query(1,n,1,finalHeight);     
    }
    /* 
    int main() 
    {  
        // setIO("input"); 
        init(); 
        int n,m; 
        scanf("%d%d",&n,&m);        
        for(int i=1;i<=m;++i) 
        {
            int op,l,r,h; 
            scanf("%d%d%d%d",&op,&l,&r,&h);   
            ++l,++r;    
            if(op==1) update(1,n,1,l,r,0,h);      
            if(op==2) update(1,n,1,l,r,1,h);    
        }    
        query(1,n,1);    
        return 0; 
    }
    */  
    

      

  • 相关阅读:
    114. Flatten Binary Tree to Linked List
    odoo docker环境下将日志存储在数据库中ir_logging
    odoo 日志切割存储,日志存储到数据库中
    odoo 通过nginx反向代理后获取真实IP地址
    html样式超出长度部分使用省略号显示
    vim 查找字串所在的位置
    系统重启 后 Docker服务及容器自动启动设置
    字串格式化换format使用
    markdown 测试代码高亮
    协程与线程的简单区分
  • 原文地址:https://www.cnblogs.com/guangheli/p/12567090.html
Copyright © 2011-2022 走看看