對於給定的開區間集合 i 和正整數 k,計算開區間集合 i 的最長 k可重區間集的長度。
輸入格式:
的第 1 行有 2 個正整數 n和 k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。
輸出格式:
將計算出的最長 k可重區間集的長度輸出
輸入樣例#1:
4 2輸出樣例#1:1 76 8
7 10
9 13
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次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...