POJ1201 Intervals 差分約束

2021-08-22 06:12:34 字數 1093 閱讀 7661

題意:給出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 ...