Intervals 差分約束系統

2022-05-17 22:17:34 字數 1161 閱讀 2941

題意:給定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 #include 

3const

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 }

view code

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...