【題目大意】:讓你從[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 ...