在數軸上有 n個閉區間 [l1,r1],[l2,r2],...,[ln,rn]。現在要從中選出 m 個區間,使得這 m個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 x,使得對於每乙個被選中的區間 [li,ri],都有 li≤x≤ri。
對於乙個合法的選取方案,它的花費為被選中的最長區間長度減去被選中的最短區間長度。區間 [li,ri] 的長度定義為 ri−li,即等於它的右端點的值減去左端點的值。
求所有合法方案中最小的花費。如果不存在合法的方案,輸出 −1。
輸入格式:
第一行包含兩個正整數 n,m用空格隔開,意義如上文所述。保證 1≤m≤n
接下來 n行,每行表示乙個區間,包含用空格隔開的兩個整數 li 和 ri 為該區間的左右端點。
n<=500000,m<=200000,0≤li≤ri≤10^9
輸出格式:
只有一行,包含乙個正整數,即最小花費。
輸入樣例#1:
6 3輸出樣例#1:3 51 2
3 42 2
1 51 4
線段樹+貪心~
我們先把線段按照長度排序,然後從短到長加入,用線段樹記錄重複最多的地方重複了x次,當x>=m時更新答案,然後刪去前面的邊直到x
#include#include#include#includeusing namespace std;
int n,m,x,y,ans,xx[1000001],tot1,tot2,cnt,root;
struct node
while(ch>='0' && ch<='9')
return x*f;
}void pushdown(int u)
void add(int u,int v,int l,int r,int val,int &rot)
if(c[rot].tag) pushdown(rot);
int mid=l+r>>1;
if(u<=mid) add(u,v,l,mid,val,c[rot].l);
if(v>mid) add(u,v,mid+1,r,val,c[rot].r);
c[rot].mx=max(c[c[rot].l].mx,c[c[rot].r].mx);
}int main(); }
sort(xx+1,xx+tot1+1);
tot1=unique(xx+1,xx+tot1+1)-xx-1;
for(int i=1;i<=n;i++)
sort(a+1,a+n+1);
for(int i=1,las=1;i<=n;i++) }
if(ans==0x3f3f3f3f) ans=-1;
printf("%d\n",ans);
return 0;
}
題解 P1712 NOI2016 區間
先按照長度排個序,然後依次新增區間。什麼是新增?設這個區間是 l r l,r 新增就是把al al 1,al 2,a r al,al 1 al 2,ar 都加上1 1 其中ai role presentation style position relative aia i表示第 i i 個位置被幾個...
洛谷p1603 區間dp
區間dp 在區間上進行動態規劃,求解一段區間上的最優解。主要是通過合併小區間的 最優解進而得出整個大區間上最優解的dp演算法。核心思路 思路 求解在乙個區間上的最優解,那麼把這個區間分割成乙個個小區間,求解每個小區間的最優解,再合併小區間得到大區間即可。所以可以列舉區間長度len 為每次分割成的小區...
luogu P1712區間 題解
noi2016 區間 在數軸上有nn 個閉區間 l 1,r 1 l 2,r 2 l n,r n l1 r1 l2 r2 ln rn 現在要從中選出mm個區間,使得這mm 個區間共同包含至少乙個位置。換句話說,就是使得存在乙個 xx 使得對於每乙個被選中的區間 l i,r i li ri 都有 l i...