week8 A 區間選點

2022-06-22 08:33:09 字數 1435 閱讀 4180

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 [ai, bi] 裡至少有 ci 個點

使用差分約束系統的解法解決這道題

input

輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 <= n <= 50000, 0 <= ai <= bi <= 50000 並且 1 <= ci <= bi - ai+1。

output

輸出乙個整數表示最少選取的點的個數

sample input

5

3 7 3

8 10 3

6 8 1

1 3 1

10 11 1

sample output

6
差分約束思想:

關鍵在於構造不等式組(包括解的合理性)==> 單源最短路

對於差分約束中的每乙個不等式約束 xi - xj <= c, 都可以移項變形為xi <=xj +c

與圖的最短路問題中的鬆弛操作類似    (dis [ i ] <= dis [ j ] + w( i , j )

具體做法:

記 dis [ i ]表示數軸上 [ 0,i ]之間選點的個數

對於第i個區間 [ai,bi] 需要滿足 dis [bi] - dis [ai-1]>=ci,

注意:為保證dis有意義:需滿足0<= dis [ i ] - dis [ i-1 ] <= 1

code:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

intmaxn,tot;

9int head[50010],dis[50010

];10 queueq;

1112

struct

nodee[50010*3

];16

17bool b[50010

];18

19void add(int u,int v,int

w)20

26void

spfa()

2744}45

}46return;47

}48intmain()

4959

for(int i=1;i<=maxn;i++)

6064

spfa();

65 printf("%d"

,dis[maxn]);

6667

return0;

68 }

Week8 A 區間選點

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 50000 並且 1 ci b...

week8 A 區間選點(差分約束系統)

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點。使用差分約束系統的解法解決這道題!input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai b...

week8 A 區間選點 II(差分約束)

一 題目描述 給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 input 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000...