zoukankan      html  css  js  c++  java
  • BZOJ 4491: 我也不知道题目名字是什么 线段树+离线

    code: 

    #include <string> 
    #include <cstring>  
    #include <cstdio> 
    #include <algorithm>      
    #define N 50003     
    #define lson now<<1 
    #define rson now<<1|1   
    #define inf 100000000   
    using namespace std; 
    void setIO(string s) {
        string in=s+".in"; 
        string out=s+".out"; 
        freopen(in.c_str(),"r",stdin); 
        // freopen(out.c_str(),"w",stdout); 
    }         
    int n; 
    int sm[N]; 
    int bg[N];   
    int pos[N]; 
    int val[N];  
    int mx[N<<2]; 
    int mn[N<<2];   
    int answer[N];  
    struct node {
        int x; 
        int id;     
        node(int x=0,int id=0):x(x),id(id){}  
    }a[N<<1];   
    struct data {
        int l,r,id; 
        data(int l=0,int r=0,int id=0):l(l),r(r),id(id){}     
    }e[N];   
    bool cmp(node a,node b) {
        return a.x==b.x?a.id<b.id:a.x<b.x;  
    }
    bool cmp_data(data a,data b) {
        return a.r<b.r;  
    }  
    void build(int l,int r,int now) {
        if(l==r) {
            mn[now]=inf; 
            mx[now]=-inf; 
            return; 
        } 
        int mid=(l+r)>>1; 
        build(l,mid,lson); 
        build(mid+1,r,rson);         
    }
    void fix_mn(int l,int r,int now,int p,int v) {   
        if(l==r) {
            mn[now]=v;        
            return; 
        } 
        int mid=(l+r)>>1;        
        if(p<=mid) {
            fix_mn(l,mid,lson,p,v); 
        } 
        else {
            fix_mn(mid+1,r,rson,p,v); 
        }        
        mn[now]=min(mn[lson],mn[rson]);   
    }   
    void fix_mx(int l,int r,int now,int p,int v) { 
        if(l==r) {
            mx[now]=v;    
            return; 
        }    
        int mid=(l+r)>>1;    
        if(p<=mid) {
            fix_mx(l,mid,lson,p,v); 
        } 
        else {
            fix_mx(mid+1,r,rson,p,v);  
        }
        mx[now]=max(mx[lson],mx[rson]);   
    } 
    int que_mn(int l,int r,int now,int L,int R) {
        if(l>=L&&r<=R) {
            return mn[now]; 
        } 
        int mid=(l+r)>>1,re=inf;  
        if(L<=mid) {
            re=min(re,que_mn(l,mid,lson,L,R)); 
        } 
        if(R>mid) {
            re=min(re,que_mn(mid+1,r,rson,L,R));      
        } 
        return re; 
    }  
    int que_mx(int l,int r,int now,int L,int R) {
        if(l>=L&&r<=R) {
            return mx[now]; 
        } 
        int mid=(l+r)>>1,re=-inf;   
        if(L<=mid) {
            re=max(re,que_mx(l,mid,lson,L,R)); 
        } 
        if(R>mid) {
            re=max(re,que_mx(mid+1,r,rson,L,R)); 
        } 
        return re;  
    }
    int main() { 
        // setIO("input");      
        int i,j,cnt=0; 
        scanf("%d",&n); 
        for(i=1;i<=n;++i) {
            scanf("%d",&val[i]); 
        }  
        pos[n]=sm[n]=bg[n]=n;   
        for(i=n-1;i>=1;--i) {
            sm[i]=(val[i+1]<=val[i]?sm[i+1]:i);   
            bg[i]=(val[i+1]>=val[i]?bg[i+1]:i);   
            pos[i]=max(sm[i],bg[i]);          
            a[++cnt]=node(i,0);   
            a[++cnt]=node(pos[i],i);   
        }                              
        sort(a+1,a+1+cnt,cmp);   
        int q; 
        scanf("%d",&q); 
        for(i=1;i<=q;++i) {
            scanf("%d%d",&e[i].l,&e[i].r); 
            e[i].id=i;  
        }     
        sort(e+1,e+1+q,cmp_data);   
        build(1,n,1);    
        for(i=j=1;i<=q;++i) {       
            while(j<=cnt&&a[j].x<=e[i].r) {
                if(a[j].id) {   
                    fix_mn(1,n,1,a[j].id,inf);     
                    fix_mx(1,n,1,a[j].id,a[j].x-a[j].id+1);   
                } 
                else {     
                    fix_mn(1,n,1,a[j].x,a[j].x);   
                }
                ++j; 
            }
            answer[e[i].id]=max(e[i].r-que_mn(1,n,1,e[i].l,e[i].r)+1, que_mx(1,n,1,e[i].l,e[i].r));  
        }
        for(i=1;i<=q;++i) {
            printf("%d
    ",answer[i]); 
        }
        return 0; 
    }
    

      

  • 相关阅读:
    Nmap帮助文档解释
    用servlet设置过滤器处理中文乱码
    Linux服务器远程连接window服务器并执行cmd命令
    java中的异常处理
    java的反射机制
    react入门
    多线程编程
    软件工程基本概念
    反射、类加载与垃圾回收
    数据库
  • 原文地址:https://www.cnblogs.com/guangheli/p/12076013.html
Copyright © 2011-2022 走看看