线段树75pts,Wa#1 #3 #6 #7 #8求调
查看原帖
线段树75pts,Wa#1 #3 #6 #7 #8求调
1263684
Elysialr楼主2024/10/18 17:31
#include<bits/stdc++.h>
using namespace std;
#define x_lc (x<<1)
#define x_rc (x<<1|1)
#define x_mid ((t[x].l+t[x].r)>>1)

int num[2000001];
map<int,int> p;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct line{
    int l,r;
    vector<int> cnt;
    int leng(){
        return r-l;
    }
};
bool cmp(line l1,line l2){
    return l1.leng()<l2.leng();
}
struct tree{
    int add;
    int data;
    int l,r;
    int leng(){
        return r-l+1;
    }
};

tree t[5000001];
line ln[800001];
int maxn,n=read(),m=read();
int res=(1<<30);


void build(int x,int l,int r){
    t[x].add=0;
    t[x].l=l;
    t[x].r=r;
    t[x].data=0;
    if(l<r){
        build(x_lc,l,x_mid);
        build(x_rc,x_mid+1,r);
    }
}
void spread(int x){
    int y=t[x].add;
    t[x_lc].add+=y;
    t[x_rc].add+=y;
    t[x_lc].data+=y;
    t[x_rc].data+=y;
    t[x].add=0;
}
void add(int x,int l,int r){
    if(t[x].l>=l&&t[x].r<=r){
        t[x].data++;
        t[x].add++;
        return;
    }
    spread(x);
    if(x_mid>=l) add(x_lc,l,r);
    if(x_mid+1<=r) add(x_rc,l,r);
    t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void cut(int x,int l,int r){
    if(t[x].l>=l&&t[x].r<=r){
        t[x].data--;
        t[x].add--;
        return;
    }
    spread(x);
    if(x_mid>=l) cut(x_lc,l,r);
    if(x_mid+1<=r) cut(x_rc,l,r);    
    t[x].data=max(t[x_lc].data,t[x_rc].data);
}
int finds(int x,int l,int r){
    if(t[x].l>=l&&t[x].r<=r) 
    return t[x].data;

    spread(x);
    int y=-1;
    if(x_mid>=l) y=max(y,finds(x_lc,l,r));
    if(x_mid+1<=r) y=max(y,finds(x_rc,l,r));
    return y;
}

int main(){
    for(int i=1;i<=n;i++){
        ln[i].l=read();
        ln[i].r=read();
        num[i]=ln[i].l;
        num[i+n]=ln[i].r;
    }
    sort(ln+1,ln+n+1,cmp);
    sort(num+1,num+2*n+1);
    unique(num+1,num+2*n+1);
    for(int i=1;i<=2*n;i++){
        if(num[i]<=num[i-1])
        break;
        p[num[i]]=i;
        maxn=i;
    }
    build(1,1,maxn);
    for(int l=1,r=1;r<=n;r++){
        add(1,p[ln[r].l],p[ln[r].r]);
        while(finds(1,1,maxn)>=m){
            res=min(res,ln[r].leng()-ln[l].leng());
            cut(1,p[ln[l].l],p[ln[l].r]);
            l++;
        }
    }
    if(res==(1<<30)) cout<<-1;
    else cout<<res;
    return 0;
}
2024/10/18 17:31
加载中...