题目描述
在数轴上有
对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间
求所有合法方案中最小的花费。如果不存在合法的方案,输出
输入格式
第一行包含两个正整数
接下来
输出格式
只有一行,包含一个正整数,即最小花费。
样例一
input
6 3 3 5 1 2 3 4 2 2 1 5 1 4
output
2
explanation

如图,当
样例二
见样例数据下载。
样例三
见样例数据下载。
限制与约定
所有测试数据的范围和特点如下表所示:
测试点编号 | |||
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | 0 \le l_i \le r_i \le 10^9 | ||
18 | |||
19 | |||
20 |
时间限制:
空间限制:
下载
分析
离散化,按照区间长度排序,维护一个双指针,滑动窗口,用一个线段树来维护点被覆盖的次数即可。
代码
#include<cstdio> #include<algorithm> using namespace std; #define MAXN 500000 int r[MAXN*2+10],rcnt,m,n,ans=0x7fffffff; struct itv{ int l,r,len; inline itv(){ } inline itv(int l,int r):l(l),r(r),len(r-l){ } bool operator<(const itv &b)const{ return len<b.len; } }a[MAXN+10]; struct node{ int tagp,tag0,mx; }tree[MAXN*8+10]; inline void push_down(int i){ if(tree[i].tag0){ tree[i<<1].tag0=tree[(i<<1)|1].tag0=1; tree[i<<1].mx=tree[i<<1].tagp=0; tree[(i<<1)|1].mx=tree[(i<<1)|1].tagp=0; tree[i].tag0=0; } if(tree[i].tagp){ tree[i<<1].mx+=tree[i].tagp,tree[(i<<1)].tagp+=tree[i].tagp; tree[(i<<1)|1].mx+=tree[i].tagp,tree[(i<<1)|1].tagp+=tree[i].tagp; tree[i].tagp=0; } } inline void update(int i){ tree[i].mx=max(tree[i<<1].mx,tree[(i<<1)|1].mx); } void insert(int i,int l,int r,int ll,int rr,int d){ if(ll<=l&&r<=rr){ tree[i].tagp+=d; tree[i].mx+=d; return; } if(ll>r||rr<l) return; int mid((l+r)>>1); push_down(i); insert(i<<1,l,mid,ll,rr,d); insert((i<<1)|1,mid+1,r,ll,rr,d); update(i); } int get_mx(int i,int l,int r,int ll,int rr){ if(ll<=l&&r<=rr) return tree[i].mx; if(ll>r||rr<l) return 0; int mid((l+r)>>1); push_down(i); return max(get_mx(i<<1,l,mid,ll,rr),get_mx((i<<1)|1,mid+1,r,ll,rr)); } void Read(int &x){ static char c; bool f(0); while(c=getchar(),c!=EOF){ if(c=='-') f=1; else if(c>='0'&&c<='9'){ x=c-'0'; while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0'; ungetc(c,stdin); if(f) x=-x; return; } } } void read(){ Read(n),Read(m); int i,L,R; for(i=1;i<=n;i++){ Read(L),Read(R); r[++rcnt]=L,r[++rcnt]=R; a[i]=itv(L,R); } sort(r+1,r+rcnt+1); rcnt=unique(r+1,r+rcnt+1)-r-1; for(i=1;i<=n;i++){ a[i].l=lower_bound(r+1,r+rcnt+1,a[i].l)-r; a[i].r=lower_bound(r+1,r+rcnt+1,a[i].r)-r; } sort(a+1,a+n+1); } void solve(){ int i=1,j=2; tree[1].tag0=1,tree[1].tagp=tree[1].mx=0; insert(1,1,rcnt,a[1].l,a[1].r,1); while(i<=n){ while(j<=n&&tree[1].mx<m){ insert(1,1,rcnt,a[j].l,a[j].r,1); j++; } if(tree[1].mx<m) break; ans=min(ans,a[j-1].len-a[i].len); insert(1,1,rcnt,a[i].l,a[i].r,-1); i++; } } int main() { read(); solve(); if(ans==0x7fffffff) puts("-1"); else printf("%d\n",ans); }
来源:https://www.cnblogs.com/outerform/p/5921802.html