ZOJ 1508 Intervals 差分約束

2022-05-28 07:27:13 字數 1229 閱讀 1161

題意:給定若干個連續的整數區間[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...