码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ4653 [Noi2016]区间

时间:2016-08-02 20:41:21      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

 

同UOJ222,双倍经验题

 

//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#ifdef WIN32   
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXN = 500011;
int n,m,cnt,L,ql,qr,val;
int p[MAXN*4],ans;
struct cha{
    int l,r,len;
}Q[MAXN];

struct node{
    int lazy,maxl;
}a[MAXN*8];

inline int getint()
{
       int w=0,q=0;
       char c=getchar();
       while((c<0 || c>9) && c!=-) c=getchar();
       if (c==-)  q=1, c=getchar();
       while (c>=0 && c<=9) w=w*10+c-0, c=getchar();
       return q ? -w : w;
}

inline bool cmp(cha q,cha qq){ return q.len<qq.len;  }

inline void pushdown(int root,int l,int r){
    if(!a[root].lazy) return ;
    int lc=root*2,rc=lc+1;
    a[lc].lazy+=a[root].lazy; a[rc].lazy+=a[root].lazy;
    a[lc].maxl+=a[root].lazy; a[rc].maxl+=a[root].lazy;
    a[root].lazy=0;    
}

inline void update(int root,int l,int r){
    if(ql<=l && r<=qr) { a[root].lazy+=val; a[root].maxl+=val; return ; } 
    pushdown(root,l,r);
    int mid=(l+r)/2; int lc=root*2,rc=lc+1;
    if(ql<=mid) update(lc,l,mid); if(qr>mid) update(rc,mid+1,r);
    a[root].maxl=max(a[lc].maxl,a[rc].maxl);
}

inline void work(){
    n=getint(); m=getint(); for(int i=1;i<=n;i++) Q[i].l=getint(),Q[i].r=getint(),p[++cnt]=Q[i].l,p[++cnt]=Q[i].r,Q[i].len=Q[i].r-Q[i].l;
    sort(p+1,p+cnt+1);
    L=unique(p+1,p+cnt+1)-p-1;
    for(int i=1;i<=n;i++) Q[i].l=lower_bound(p+1,p+L+1,Q[i].l)-p,Q[i].r=lower_bound(p+1,p+L+1,Q[i].r)-p;//离散化
    int now=0; sort(Q+1,Q+n+1,cmp);
    ans=(1<<30);
    for(int i=1;i<=n;i++) {//决策单调性,一定是连续区间
    while(a[1].maxl<m) {
        if(now==n) return ;
        now++; val=1;  ql=Q[now].l; qr=Q[now].r;
        update(1,1,L);
    }
    ans=min(Q[now].len-Q[i].len,ans);
    ql=Q[i].l; qr=Q[i].r; val=-1;
    update(1,1,L);
    }
}

int main()
{
  work();
  if(ans==(1<<30)) ans=-1;
  printf("%d",ans);
  return 0;
}

 

BZOJ4653 [Noi2016]区间

标签:

原文地址:http://www.cnblogs.com/ljh2000-jump/p/5730455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!