題意:給定若干個連續的整數區間[ai, bi]以及ci,現在要求這樣乙個集合z,集合z中的元素與每個給定的區間的元素交集至少有ci個。
解法:通過把dis[i]看做z中小於等於整數i一共有多少個元素。那麼對於題目給定條件有表示式dis[b] - dis[a-1] >= ci,根據這個不等式就能夠進行構邊了。除此之外,還有一些隱含的條件:0 <= dis[i]-dis[i-1] <= 1,對這些關係同樣進行構邊。然後要求的值就是dis[max] - dis[min-1] >= m中的m,其中max和min是出現的最小左、右邊界,令dis[max] = 0,那麼就是求解的就是從max到min-1的最短路的相反數。
這裡解釋下為什麼是從max到min-1的最短路,由於有dis[max]-dis[min-1]>=m恆成立時,而m同樣是乙個變數,因此要大於m就要大於m的最大值,因此問題轉化為這個不等式中如何求解m的最大值,通過對式子的轉化就為dis[min-1]-dis[max]<=-m,也就是求-m的最小值,而這個-m在途中最小就是min-1到max的最短路了,否則dis[min-1]就會被dis[max]-m代替了。
**如下:
#include #include#include
#include
#include
using
namespace
std;
int n, idx, head[50005
];int
min, max;
//設對圖求出最短路表示的資訊dis[i]表示z集合中包含有多少個小於i的數
struct
edge e[
160000
];void insert(int a, int b, int
ct)
int dis[50005
];char vis[50005
];#include
void
spfa() }}
}}int
main()
for (int i = min; i <= max; ++i)
spfa();
printf(
"%d\n
", -dis[min-1
]); }
return
0;
}
Intervals(差分約束)
題意 給出n個整數區間 ai,bi 並且給出乙個約束ci,1 ci bi ai 1 使得陣列z在區間 ai,bj 的個數 ci個,求出陣列z的最小長度。思路 建立差分約束系統。因為這裡要求陣列長度的最小值,要變為x y k的標準形式。設陣列 s j 表示陣列 z 區間 0,j 裡包含的元素個數。所以...
Intervals 差分約束系統
題意 給定n個整數閉區間 a,b 和n個整數c,求乙個最小的整數集合z,滿足z裡邊的數中範圍在閉區間 a,b 的個數不小於c個。思路 根據題目描述,可建模成乙個差分約束系統。設s i 表示小於等於i的整數的個數,r表示最大的右端點值,l表示最小的左端點值 則 s b s a 1 c 轉化成 s a ...
差分約束系統 間隔Intervals
2019 07 10 題目及 偽 題解更新 2021 05 16 我人真的傻了 這已經超出碳基生物的整活範圍了 沒想到時隔多年重學差分約束系統 搜到的題解竟然是兩年前自己打的555我真的是越學越菜 不過 好像貼成樓下樹形dp的了 更新了 tip 翻譯來自谷歌,如有出入請見諒 include incl...