題意:給出n個閉區間[ai, bi],每個區間還有個正整數ci,表示需要在區間i中至少取到ci個數。求要滿足所有的n個約束條件,最少要取多少個數字。
思路:設s(k)為從區間[0,k]中取到的數字的個數,則s(bi) - s(ai - 1) >= ci。
另外有0 <= s(i) - s(i - 1) <= 1,(i = 0,1,...,n-1)
為了方便計算,將所有下標向右移1位,設mx = max(bi),則結果應為 min(s(mx) - s(0)),s(0) = 0。
要求最小值,用spfa求最長路即可。
#include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 50005;
struct edgg[maxn << 2];
int tot, pre[maxn];
int n, dis[maxn], mx;
bool vis[maxn];
void add(int u, int v, int w)
int spfa()
memset(vis, 0, sizeof(vis));
queueque;
que.push(0);
dis[0] = 0;
vis[0] = true;
while (!que.empty()) }}
}return dis[mx];
}int main()
add(a, b + 1, c);
//printf("%d %d %d\n", a, b + 1, c);
}for (int i = 1; i <= mx; ++i)
printf("%d\n", spfa());
return 0;
}
差分約束 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 ...