65pts TLE求条
查看原帖
65pts TLE求条
934048
ni_ju_ge楼主2025/7/30 09:21
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,k,ans,ll,rr;
struct fre {
	int l,r,id;
} a[N];
struct xgd {
	int l,r;
	int dat;
	int key;
} v[N];
int root,cnt,tot;
int make(int val) {
	v[++cnt].dat=val;
	v[cnt].key=rand();
	tot++;
	return cnt;
}
int merge(int r1,int r2) {
	if(!r1||!r2) return r1+r2;
	if(v[r1].dat>=v[r2].dat) {
		if(v[r1].key<=v[r2].key) v[r2].l=merge(r1,v[r2].l);
		else v[r2].r=merge(r1,v[r2].r);
		return r2;
	} else {
		if(v[r2].key<=v[r1].key) v[r1].l=merge(v[r1].l,r2);
		else v[r1].r=merge(v[r1].r,r2);
		return r1;
	}
}
void take(int val) {
	root=merge(root,make(val));
}
void del() {
	root=merge(v[root].l,v[root].r);
	tot--;
}
bool cmp(fre x,fre y) {
	if(x.l==y.l) return x.r<y.r;
	return x.l<y.l;
}
int main() {
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++) {
		scanf("%d %d",&a[i].l,&a[i].r);
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) {
		take(a[i].r);
		while(tot>k) del();
		if(tot==k) {
			if(ans<v[root].dat-a[i].l) {
				ll=a[i].l;
				rr=v[root].dat;
				ans=rr-ll;
			}
		}
	}
	cout<<ans<<endl;
	tot=0;
	for(int i=1;i<=n;i++) {
		if(a[i].l<=ll&&a[i].r>=rr) {
			printf("%d ",a[i].id);
			tot++;
			if(tot==k) break;
		}
	}
}
2025/7/30 09:21
加载中...