題意:給定n個整數閉區間[a,b]和n個整數c,求乙個最小的整數集合z,滿足z裡邊的數中範圍在閉區間[a,b]的個數不小於c個。
思路:根據題目描述,可建模成乙個差分約束系統。
設s[i]表示小於等於i的整數的個數,r表示最大的右端點值,l表示最小的左端點值:
則 s[b] - s[a-1] >= c;
轉化成:s[a-1] - s[b] <= -c;...... (1)
s[i] - s[i-1] <= 1; ........ (2)
s[i] -s[i-1] >= 0;
轉化成:s[i-1] - s[i] <= 0;.......... (3)
(1)(2)(3)即為三個約束條件。最終要求的就是s[r] - s[l-1] >= m,即 s[l-1] - s[r] <= -m;
1 #include 2 #includeview code3const
int n=50005;4
const
int inf=1
<<28;5
struct
node
6 edge[n];
9int
dis[n];
10int n,cnt,l,r;//
l表示所有左端點的最小值,r表示所有右端點的最大值
11void add(int u,int v,int
w)12
17bool
bellman_ford()
1833}34
for (int i = l; i <= r; i++)//
根據約束條件s[i] <= s[i-1]+1,進一步修改s[i];
3541}42
for (int i = r; i >= l; i--)//
根據約束條件s[i] >= s[i-1],進一步修改s[i-1];
434950}
51}52return
true;53
}54intmain()
5569
bellman_ford();
70 printf("
%d\n
",dis[r]-dis[l-1
]);71}72
return0;
73 }
Intervals(差分約束)
題意 給出n個整數區間 ai,bi 並且給出乙個約束ci,1 ci bi ai 1 使得陣列z在區間 ai,bj 的個數 ci個,求出陣列z的最小長度。思路 建立差分約束系統。因為這裡要求陣列長度的最小值,要變為x y k的標準形式。設陣列 s j 表示陣列 z 區間 0,j 裡包含的元素個數。所以...
差分約束系統 間隔Intervals
2019 07 10 題目及 偽 題解更新 2021 05 16 我人真的傻了 這已經超出碳基生物的整活範圍了 沒想到時隔多年重學差分約束系統 搜到的題解竟然是兩年前自己打的555我真的是越學越菜 不過 好像貼成樓下樹形dp的了 更新了 tip 翻譯來自谷歌,如有出入請見諒 include incl...
刷題 差分約束 intervals
ai,bi 區間內 和 點集z至少有ci個共同元素,如果用 si 表示區間 0,i 區間內至少有多少個元素的話,那麼sbi sai ci,但是有很多點依然沒有相連線起來 0 si si 1 1 1 差分約束 條件轉化 sum j sum i 1 c i sum i 1 sum j c i i 1 j...