样例没过,已经快改成题解的样子了
查看原帖
样例没过,已经快改成题解的样子了
1419569
Z_kazuha楼主2025/1/9 21:15
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+6;
int n,m,siz,a[N],minn,maxn;
struct node{int l,r,z;}e[N];
bool cmp(node a,node b){return a.z<b.z;}
int tree[N<<4],tag[N<<4];
int ls(int p) {return p<<1;}
int rs(int p) {return p<<1|1;}
void push_up(int p){
	tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void addtag(int p,int pl,int pr,int d){
	tag[p]+=d;
	tree[p]+=d*(pr-pl+1);
}
void push_down(int p,int pl,int pr){
	if(tag[p]){
		int mid=(pl+pr)>>1;
		addtag(ls(p),pl,mid,tag[p]);
		addtag(rs(p),mid+1,pr,tag[p]);
		tag[p]=0;
	}
}
void update(int p,int L,int R,int pl,int pr,int d){
	if(L<=pl&&R>=pr){
		addtag(p,pl,pr,d);
		return;
	}
	int mid=(pl+pr)>>1;
	push_down(p,pl,pr);
	if(L<=mid)update(ls(p),L,R,pl,mid,d);
	if(R>mid)update(rs(p),L,R,mid+1,pr,d);
	push_up(p);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[i*2]=x,a[i*2+1]=y;
		e[i].l=x,e[i].r=y,e[i].z=y-x;
	}
	sort(a+1,a+n*2+2);
	siz=unique(a+1,a+n*2+1)-(a+1);
	sort(e+1,e+1+n,cmp);
	minn=N;
	for(int i=1;i<=n;i++){
		e[i].l=lower_bound(a+1,a+siz+1,e[i].l)-a;
		e[i].r=lower_bound(a+1,a+siz+1,e[i].r)-a;
	//	cout<<e[i].l<<" "<<e[i].r<<" ";
		minn=min(minn,e[i].l),maxn=max(maxn,e[i].r);
	}
	int s=0,t=0,ans=1e9;
	while(t<n){
		while(tree[1]<m&&t<=n){
			t++;
			update(1,e[t].l,e[t].r,minn,maxn,1);
		}
		if(tree[1]<m)break;
		while(tree[1]>=m&&t>=s){
			s++;
			update(1,e[s].l,e[s].r,minn,maxn,-1);
		}
		ans=min(ans,e[t].z-e[s].z);			
	//	cout<<e[t].z<<" "<<e[s].z<<endl;
	}
	if(ans==1e9)ans=-1;
	cout<<ans;
	return 0;
}
2025/1/9 21:15
加载中...