记录编号 292619 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2016]区间 最终得分 100
用户昵称 GravatarTenderRun 是否通过 通过
代码语言 C++ 运行时间 9.348 s
提交时间 2016-08-09 10:53:35 内存使用 44.92 MiB
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define mid ((l+r)>>1)
using namespace std;
const int maxn=1000010;
const int INF=1000000000;
int Mx[maxn<<2],sum[maxn<<2],ans=INF,n,m,N;
int la[maxn],lb[maxn],b[maxn],p[maxn],kl[maxn];
bool cmp(int a,int b){return kl[a]<kl[b];}
void Modify(int x,int l,int r,int a,int b,int v){
	if(l>=a&&r<=b){Mx[x]+=v;sum[x]+=v;return;}
	if(mid>=a)Modify(x<<1,l,mid,a,b,v);
	if(mid<b)Modify(x<<1|1,mid+1,r,a,b,v);
	Mx[x]=max(Mx[x<<1],Mx[x<<1|1])+sum[x];
}
int main(){
	freopen("interval.in","r",stdin);
	freopen("interval.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;p[i]=i,i++){
		scanf("%d%d",&la[i],&lb[i]);
		b[++N]=la[i];b[++N]=lb[i];
		kl[i]=lb[i]-la[i]+1;
	}	
	sort(p+1,p+n+1,cmp);sort(b+1,b+N+1);
	N=unique(b+1,b+N+1)-b-1;
	for(int t=1;t<=n;t++){int i=p[t];
		la[i]=lower_bound(b+1,b+N+1,la[i])-b;
		lb[i]=lower_bound(b+1,b+N+1,lb[i])-b;
	}
	for(int i=1,j=0;j<n||Mx[1]==m&&j==n;){
		while(Mx[1]<m&&j<n)++j,Modify(1,1,N,la[p[j]],lb[p[j]],1);
		while(Mx[1]==m&&i<=n)ans=min(ans,kl[p[j]]-kl[p[i]]),Modify(1,1,N,la[p[i]],lb[p[i]],-1),i++;
	}
	if(ans==INF)ans=-1;
	printf("%d\n",ans);
	return 0;
}