WA求助
查看原帖
WA求助
113521
muyang_233楼主2020/8/4 15:17

rt,这个萌新他查不出错/kk
只有5分,而且len的确是离散化前的值

#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 500000
#define debug puts("qaq")
struct TREE{
	int l,r;
	int maxn,lazy;
}tree[4*MAXN+5];
struct LINE{
	int len,p;
}input[MAXN+5];
struct node{
	int v,p;
}qaq[2*MAXN+5];
int n,m;
int sum;
int ans=0x3f3f3f3f;
int nl[MAXN],nr[MAXN];
inline int max(int a,int b){
	return a>b?a:b;
}
inline int min(int a,int b){
	return a<b?a:b;
}
bool cmp1(node _1,node _2){
	return _1.v<_2.v;
}
bool cmp2(LINE _1,LINE _2){
	return _1.len<_2.len;
}
void pushdown(int id){
	if (tree[id].lazy){
		tree[id<<1].maxn+=tree[id].lazy;
		tree[id<<1|1].maxn+=tree[id].lazy;
		tree[id<<1].lazy+=tree[id].lazy;
		tree[id<<1|1].lazy+=tree[id].lazy;
		tree[id].lazy=0;
		return;
	}
}
void pushup(int id){
	tree[id].maxn+=max(tree[id<<1].maxn,tree[id<<1|1].maxn);
}
void build(int id,int l,int r){
	tree[id].l=l;
	tree[id].r=r;
	tree[id].maxn=0;
	if (l==r){
		return;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
}
void update(int id,int l,int r,int x){
//	if (x==1){
//		printf("%d %d\n",tree[id].l,tree[id].r);
//	}
	if (l>tree[id].r||r<tree[id].l){
		return;
	}
	if (l<=tree[id].l&&r>=tree[id].r){
		tree[id].maxn+=x;
		tree[id].lazy+=x;
		return;
	}
	int mid=(tree[id].l+tree[id].r)>>1;
	pushdown(id);
	update(id<<1,l,r,x);
	update(id<<1|1,l,r,x);
	pushup(id);
}
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++){
		int l,r;
		scanf("%d%d",&l,&r);
		input[i].len=r-l;
		input[i].p=i;
		qaq[i*2-1].v=l;
		qaq[i*2-1].p=i;
		qaq[i*2].v=r;
		qaq[i*2].p=i;
	}
	sort(qaq+1,qaq+2*n+1,cmp1);
	qaq[0].v=-1;
	for (int i=1;i<=2*n;i++){
		if (qaq[i].v!=qaq[i-1].v){
			int now=qaq[i].p;
			if (!nl[now]){
				nl[now]=++sum;
			}
			else{
				nr[now]=++sum;
			}
		}
	}
	build(1,1,sum);
	sort(input+1,input+n+1,cmp2);
	int st=1;
	for (int i=1;i<=n;i++){
		int now=input[i].p;
//		debug;
		update(1,nl[now],nr[now],1);
//		printf("%d\n",tree[1].maxn);
		while(tree[1].maxn==m){
			update(1,nl[st],nr[st],-1);
			ans=min(ans,input[i].len-input[st++].len);
		}
	}
	if (ans==0x3f3f3f3f){
		printf("-1");
	}
	else{
		printf("%d",ans);
	}
	return 0;
}

2020/8/4 15:17
加载中...