标签:
同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; }
标签:
原文地址:http://www.cnblogs.com/ljh2000-jump/p/5730455.html