5分求调P1712
查看原帖
5分求调P1712
921450
Szy0720楼主2024/7/13 16:25
#include<bits/stdc++.h>
#define ll long long
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
const int N=5e5+10;
int n,m,dian[N<<4],ans=0x3f3f3f3f,sum[N<<4],he[N<<4];
struct qvjian{
	int l,r;
}a[N];
bool cmp(qvjian a,qvjian b){
    return (a.r-a.l)<(b.r-b.l);
}
void jia(int x,int l,int r,int L,int R,int jias){
	if(l==L&&r==R){
		 he[x]+=jias;
		 sum[x]+=jias;
		 return;
	}
	if(L<=mid)jia(ls,l,mid,L,min(R,mid),jias);
	if(R>mid)jia(rs,mid+1,r,max(mid+1,L),R,jias);
	sum[x]=max(sum[ls],sum[rs])+he[x];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
		dian[i*2-1]=a[i].l;
		dian[i*2]=a[i].r;
    }
    sort(dian+1,dian+2*n+1);
    int nn=unique(dian+1,dian+2*n+1)-dian-1;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
    	a[i].l=lower_bound(dian+1,dian+nn+1,a[i].l)-dian;
    	a[i].r=lower_bound(dian+1,dian+nn+1,a[i].r)-dian;
	}
	int l,r;
	for(l=1,r=0;l<=n;jia(1,1,nn,a[l].l,a[l].r,1),l++){
		while(r<n&&sum[1]<m){
			r++;
			jia(1,1,nn,a[r].l,a[r].r,1);
		}
		if(sum[1]<m&&r==n)break;
		ans=min(ans,(dian[a[r].r]-dian[a[r].l]-dian[a[l].r]+dian[a[l].l]));
	}
	if(ans!=0x3f3f3f3f)cout<<ans<<endl;
	else cout<<"-1\n";
	return 0;
}
2024/7/13 16:25
加载中...