题面
https://www.luogu.org/problem/P1712
题解
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=500500; const int inf=1e9; struct point{ int val,ord; } p[N*4]; struct data{ int len,ord; } a[N*4]; int L[2*N],R[2*N],n,m,Right,cur=0; int tree[N*8],add[N*8]; bool cmp1(point x1,point x2){ return x1.val<x2.val; } bool cmp2(data x1,data x2){ return x1.len<x2.len; } void down(int rt,int l,int r){ if (!add[rt]) return; int ls=2*rt,rs=2*rt+1; tree[ls]+=add[rt]; tree[rs]+=add[rt]; add[ls]+=add[rt]; add[rs]+=add[rt]; add[rt]=0; return; } void update(int rt,int l,int r,int x,int y,int val){ if(x>r||y<l) return; if(x<=l && y>=r) { tree[rt]+=val; add[rt]+=val; return; } int mid=(l+r)/2; down(rt,l,r); update(rt*2,l,mid,x,y,val); update(rt*2+1,mid+1,r,x,y,val); tree[rt]=max(tree[rt*2],tree[rt*2+1]); } int main() { scanf("%d %d",&n,&m); for (int i=1;i<=n;i++) { int u,v; scanf("%d %d",&u,&v); a[i].len=v-u; a[i].ord=i; cur++;p[cur].val=u;p[cur].ord=i; cur++;p[cur].val=v;p[cur].ord=i; } sort(p+1,p+cur+1,cmp1); int num=1; p[0].val=-1; for (int i=1;i<=cur;i++) { if (p[i].val!=p[i-1].val) num++; int u=p[i].ord; if (!L[u]) L[u]=num; else R[u]=num; } Right=num; sort(a+1,a+n+1,cmp2); int ans=inf,le=0,ri=0; while (1) { while (tree[1]<m && ri<=n) { ri++; int u=a[ri].ord,v=L[u],w=R[u]; update(1,1,Right,v,w,1); } if (tree[1]<m) break; while (tree[1]>=m && le<=n) { le++; int u=a[le].ord,v=L[u],w=R[u]; update(1,1,Right,v,w,-1); } ans=min(ans,a[ri].len-a[le].len); } if (ans==inf) puts("-1"); else printf("%d ",ans); return 0; }