ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BZOJ 4653: [Noi2016]区间 双指针 + 线段树

2019-08-01 16:57:51  阅读:213  来源: 互联网

标签:int namespace maxv seg re Noi2016 4653 now BZOJ


Code: 

#include <cstdio>
#include <string>
#include <algorithm> 
using namespace std;  
namespace IO {
    inline void setIO(string s) {
        string in=s+".in";
        string out=s+".out"; 
        freopen(in.c_str(),"r",stdin);  
    } 
};  
const int maxn=500005;
const int inf=1000030000;   
int n,m;   
namespace tree { 
    int tag[maxn*5],maxv[maxn*5]; 
    inline void pushup(int now) {
        maxv[now]=tag[now]; 
        maxv[now]+=max(maxv[now<<1],maxv[now<<1|1]);   
    }  
    void update(int l,int r,int now,int L,int R,int v) {  
        if(l>=L&&r<=R) { 
            tag[now]+=v, maxv[now]+=v;    
            return;  
        } 
        int mid=(l+r)>>1;    
        if(L<=mid) update(l,mid,now<<1,L,R,v); 
        if(R>mid) update(mid+1,r,now<<1|1,L,R,v); 
        pushup(now);  
    }
    int query(int l,int r,int now,int L,int R) {
        if(l>=L&&r<=R) return maxv[now];       
        int mid=(l+r)>>1,re=0; 
        if(L<=mid) re=max(re,query(l,mid,now<<1,L,R)); 
        if(R>mid) re=max(re,query(mid+1,r,now<<1|1,L,R));   
        return re+tag[now];       
    }
};   
int Arr[maxn*2];  
struct Seg {   
    int l,r,len,L,R;    
}seg[maxn]; 
bool cmp(Seg a,Seg b) {
    return a.len<b.len; 
}     
int main() {
    // IO::setIO("input"); 
    scanf("%d%d",&n,&m);
    int cc=0,i,j; 
    for(i=1;i<=n;++i) {
        scanf("%d%d",&seg[i].l,&seg[i].r);      
        seg[i].len=seg[i].r-seg[i].l;  
        Arr[++cc]=seg[i].l,Arr[++cc]=seg[i].r;   
    }   
    sort(seg+1,seg+1+n,cmp);            
    sort(Arr+1,Arr+1+cc);   
    for(i=1;i<=n;++i) {
        seg[i].L=lower_bound(Arr+1,Arr+1+cc,seg[i].l)-Arr; 
        seg[i].R=lower_bound(Arr+1,Arr+1+cc,seg[i].r)-Arr;   
    }   
    int ans=inf;  
    int l=1,r=0; 
    while(l<=n&&r<=n) {            
        if(tree::query(1,cc,1,1,cc)>=m) {
            ans=min(ans, seg[r].len-seg[l].len);      
            tree::update(1,cc,1,seg[l].L,seg[l].R,-1);               
            ++l;                
        }
        else {          
            ++r;       
            if(r<=n) tree::update(1,cc,1,seg[r].L,seg[r].R,1);           
        }
    }   
    printf("%d\n",ans==inf?-1:ans);  
    return 0; 
}

  

标签:int,namespace,maxv,seg,re,Noi2016,4653,now,BZOJ
来源: https://www.cnblogs.com/guangheli/p/11283620.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有