A 區間選點 II

2021-10-04 23:14:33 字數 1040 閱讀 5828

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

設sum[i]表示區間[0,i]上點的個數,則對於某個區間[ai,bi],有sum[bi]-sum[ai-1]>=ci,同時要保證sum[i]有意義還需要0<=sum[i+1]-sum[i]<=1,故存在三種邊:

(a,b+1,c)

(i-1,i,0)

(i,i-1,-1).

從min來跑spfa最長路,dis[max(bi)+1]即為答案。

#include

#include

#include

#include

using

namespace std;

#define inf -1e9

struct edge edge[

1000010];

int head[

51010

], tot;

int n,a,b,c,mn,mx,dis[

51010];

bool vis[

51010];

queue<

int> q;

void

init()

void

add(

int x,

int y,

int w)

void

spfa()

dis[mn-1]

=0; vis[mn-1]

=1; q.

push

(mn-1)

;while

(!q.

empty()

)}}}

}int

main()

mn++

; mx++

;for

(int i = mn; i <= mx; i++

)spfa()

; cout << dis[mx]

<< endl;

return0;

}

A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點,使用差分約束系統的解法解決這道題。記sum i 表示數軸上 0,i 之間選點的個數,則對於第i個區間 ai,bi 需要滿足sum bi sum ai 1 ci。同時需要保證sum有意義,所以0...

區間選點 II 差分約束

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

Week8作業 A 區間選點II

問題描述 給定乙個數軸上的n個區間,要求在數軸上選取最少的點使得第i個區間 ai,bi 裡至少有ci個點。1 n 50000,0 ai bi 50000,1 ci bi ai 1。差分約束系統求解 結論 1.如果要求取最小值,則求最長路,將不等式全部化成xi xj k的形式,這樣建立j i的邊,權值...