最長k可重區間集

2022-02-28 15:36:47 字數 1878 閱讀 4356

對於給定的開區間集合 i 和正整數 k,計算開區間集合 i 的最長 k可重區間集的長度。

輸入格式:

的第 1 行有 2 個正整數 n和 k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。

輸出格式:

將計算出的最長 k可重區間集的長度輸出

輸入樣例#1:

4 2

1 76 8

7 10

9 13

輸出樣例#1:

15
對於100%的資料,1≤n≤500 ,1≤k≤3。

這個題貌似之前不停地開啟然後放棄掉。。貌似主要原因是看不懂題面讓我幹些什麼。。。上午的考試讓我有了充足的時間觀察題面,發現道理就是給了一堆區間,然後每個點不能被超過k個區間覆蓋,每個區間的價值是它的長度,求最大價值。

然後一開始的時候一直都是想著怎麼把互相覆蓋這個條件把握好,然後各種如果他們有交集就連邊之類的。。。後來發現並不可行,總是無法維護好。

然後看了題解豁然開朗,貌似自己的拆點連邊什麼的都沒什麼問題,甚至偽超級源這種東西都想到了,然而思路還是侷限了我,這個題要向與自己沒有交集的區間連邊。然後去跑最大費用即可。。。真是可惜了。。。

#include#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 50000000

#define re register

#define min(a,b) ausing

namespace

std;

struct

po;po edge[

250001

];struct

len;

len a[

1002

];int head[1050],num=-1

,n,m,s,t,k,s;

int dis[1050],b[1050

],tot;

inline

intread()

inline

void add_edge(int

from,int to,int w,int

dis)

inline

void add(int

from,int to,int w,int

dis)

inline

bool

spfa()}}

}return dis[s]

}inline

int dfs(int u,int

low)}}

return

diss;

}inline

intmax_flow()

}}inline

bool

cmp(len x,len y)

intmain()

sort(a+1,a+n+1

,cmp);

for(re int i=1;i)

for(re int j=i+1;j<=n;j++)

if(a[i].r<=a[j].l) add(i+n,j,1,0

);

for(re int i=1;i<=n;i++)

max_flow();

cout

<

}

P3358 最長k可重區間集問題

題目鏈結 輸入最多500個點對,即離散化後最多有1000個座標。對離散化後的座標建圖。方法一 將座標從小到大連邊,乙個點與它後面相鄰的點建一條邊 流量為inf,花費為0 點對的左端點與右端點建一條邊 流量為1,花費為 區間長度 s與第乙個點建一條邊 流量為k,花費為0 最後乙個點與t建一條邊 流量為...

最長k可重區間集合(24題)

這題最開始再網路賽的時候遇到,第一想法是貪心或者dp,然後發現需要記錄的轉態太多了。一看區間個數又很想網路流,所以就yy出了乙個假演算法,太醜了就不說了。這題正確的思路是 將答案拆分成k條路徑,每條路徑滿足包含的區間之間互相沒有交集。如果將這k條路徑按照包含區間的個數排序,那麼滿足的關係就是下乙個路...

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換l,r 首先離散化 資料範圍比較大 記錄一下l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...