洛谷 P1712 區間

2021-09-30 13:43:55 字數 1607 閱讀 1130

在數軸上有 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

3 51 2

3 42 2

1 51 4

輸出樣例#1:

線段樹+貪心~

我們先把線段按照長度排序,然後從短到長加入,用線段樹記錄重複最多的地方重複了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...