POJ1201 Intervals 差分約束

2022-08-22 22:00:12 字數 1248 閱讀 2990

【題目大意】:讓你從[1-∞] 選擇數字,需要滿足要求a,給定多組a,b,c,要求在[a,b]中必須有c個被選中,問,最少選多少個數字即可滿足要求。

【解題思路】:所有的要求都必須滿足,即滿足【最難滿足】的要求。不妨設ans[i]表示,在i之前([1,i-1])最少選中幾個。則要求可以變成 ans[b+1]-ans[a] ≥ c。

不妨想象成,從a點到b+1點有一條單向邊,權為c,必須滿足上面式子,即要求最長的c【最難滿足】需要走,即轉化為最長路問題。

另外這個轉化還有乙個隱藏條件.

即i到i+1點不能出現負邊(ans[i+1]>ans[i])

i+1最多比i多乙個數字(ans[i+1]-ans[i]≤1)

將上面的式子整理下來

ans[b+1]≥ans[a]+c

ans[i+1]≥a[i]+0

ans[i]≥ans[i+1]-1

這樣寫,很明顯應該建立

a---(c)--->b+1

i---(0)--->i+1

i+1---(-1)---i

最大路求得ans[max(b+1)]即可

初始化為ans[min(a)] = 0

1 #include "

iostream

"2 #include "

cstdio

"3 #include "

vector

"4 #include "

algorithm

"5 #include "

queue

"6 #include "

cstring"7

using

namespace

std;

8struct

edge912

};13

bool v [50004

];14

int d [50004

];15 vector e[50004

];16

intmain()

1732

for (int i = min; i <= max; i++)

3339 queue<

int>q;

40 d[min] = 0;41

q.push(min);

42 v[min] = true;43

while (!q.empty())

4459}60

}61}62 cout << d[max] <63 }

差分約束 poj 1201 Interval

差分約束 poj 1201 又是一道vector tle。確實很好的差分約束。很好的差分約束,注意隱含條件 0 d i 1 d i 1 題目保證了沒負圈。include include include using namespace std define n 50005 define inf 100...

POJ 1201 樹狀陣列

給你n個區間,每個區間為 a,b 每個區間取c個數構成乙個集合,求集合最小容量 把區間按b排序,從第乙個區間開始取,從後往前取,這樣盡可能和後面的區間重複 另外如果我們發現當前區間取得個數已經超過了c,那麼只需要讓之前區間換就行,而總數是不變的,所以不用更新答案 求當前區間已經取了多少個數用樹狀陣列...

poj 1201 差分約束

傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...