差分約束 區間選點

2021-10-04 22:34:49 字數 1095 閱讀 2026

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

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

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

這道題既可以按右端點進行排序然後貪心

也可以根據題意構造不等式組

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

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

另外sum[i]表示第i個點選與不選,所以

0<=sum[i]-sum[i-1]<=1

因為是求的差分約束系統的最小解,所以是下解,需要轉化為 ≥ 不等式組跑最長路,答案即sum[max]

求解差分約束系統,都可以轉化成圖論中單源最短路、最長路問題,(由於差分方程與最短路中的鬆弛操作相似,所以對於差分約束方程可以構造邊和點以及初始dis[s],構造差分約束的時候還需要注意一些細節,保證構造的陣列有意義

#include

#include

#include

#include

#include

using

namespace std;

#define inf 100000000

vectorint,

int>

>ve[

50010];

queue<

int>q;

bool vis[

50010];

int dis[

50010];

int n;

void

spfa

(int s)}}

}int

main()

n=maxb;

for(

int i=

1;i<=maxb;i++

)spfa(0

);cout<

}

差分約束 區間選點。c

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

區間選點 II 差分約束

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

差分約束 解決區間選點問題

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