題目:
題意:給定n組資料,每組有ai,bi,ci,要求在區間[ai,bi]內至少找ci個數, 並使得找的數字組成的陣列z的長度最小。
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;78
const
int inf = 1
<<28;9
struct
node
10edge[50010
];16
int dis[50010
];17
intmi,ma,n;
1819
void
bellman_ford()
2031
32for(i=mi; i<=ma; i++)
33if(dis[i]>dis[i-1]+1)34
3839
for(i=ma; i>=mi; i--)
40if(dis[i-1]>dis[i])
4145}46
}4748int
main()
4965
bellman_ford();
66 printf("
%d\n
",dis[ma]-dis[mi-1
]);67}68
return0;
69 }
大神的題解:
差分約束的思想:可以肯定的是s[bi]-s[ai-1]>=ci; 為什麼要ai-1,是因為ai也要選進來
在乙個是s[i]-s[i-1]<=1;
s[i]-s[i-1]>=0
①s[ai-1]-s[bi] <= -ci
②s[i]-s[i-1] <= 1
③s[i-1]-s[i] <= 0
1、約束條件必須同為<= 或者同為》=
2、若形如:x1 - x2<=k1 則 x2點 向x1點連邊,權值為k1,求最短路
若形如:x1-x2>=k1 則 x2點 向x1點連邊,權值為k1,求最長路
3、如果多組約束存在矛盾,則圖中存在負環,判斷負環的方法是用spfa判斷是否有點進隊次數》=n
差分約束 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 ...