區間(差分約束)

2021-10-10 13:59:37 字數 2014 閱讀 3485

題目描述

給定 n 個區間 [ai,bi]和 n 個整數 ci。

你需要構造乙個整數集合 z,使得∀i∈[1,n],z 中滿足ai≤x≤bi的整數 x 不少於 ci 個。

求這樣的整數集合 z 最少包含多少個數。

輸入格式

第一行包含整數 n。

接下來n行,每行包含三個整數ai,bi,ci。

輸出格式

輸出乙個整數表示結果。

資料範圍

1≤n≤50000,

0≤ai,bi≤50000,

1≤ci≤bi−ai+1

輸入樣例

53 7 3

8 10 3

6 8 1

1 3 1

10 11 1

輸出樣例

6

題目分析

這道題也是一道差分約束的問題,我們來著重考慮一下如何找不等式關係。

首先,我們需要乙個虛擬源點,為了方便操作,我們將題目中給出的所有點向右平移一位(+1),從而空出0號點來作為虛擬源點。這樣所有ai與bi的範圍就在[1,50001]之間了。

dist[i]表示區間1-i中至少包含多少個點使之滿足題目要求.

不等式條件

1.dist[i]>=dist[i-1] //因為dist[i]中包含了dist[i-1]

2.dist[i]-dist[i-1]<=1 -> dist[i-1]>=dist[i]-1

3.[a,b]中至少包含c個點 => dist[b]-dist[a-1]>=c -> dist[b]>=dist[a-1]+c

找出了所有的不等式關係之後,剩下的所有問題就都好解決了。首先是將不等式關係與邊對應:邊(u,v,w)表示u+w<=v

題目要求的是最小值,因此要求圖的最長路。根據dist的定義,最終的答案即為dist[max(v)]。

**如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

#define pii pair

#define x first

#define y second

using

namespace std;

const

int n=

5e4+

5,m=

2e5+

5,inf=

0x3f3f3f3f

;int h[n]

,e[m]

,w[m]

,ne[m]

,idx;

int dist[n]

;bool st[n]

;void

add(

int a,

int b,

int c)

void

spfa()

//spfa計算最長路}}

}}intmain()

spfa()

;printf

("%d\n"

,dist[m]);

//輸出答案

return0;

}

差分約束 區間

給定 n 個區間 ai bi 和n個整 數c i a i,b i 和 n 個整數 c i ai b i 和 n個整數 ci 你需要構造乙個整數集合 z,使得 i 1,n z 中滿足ai x bi的整數 x 不少於 c ic i ci 個。求這樣的整數集合 z 最少包含多少個數。輸入格式 第一行包含整...

差分約束 區間選點

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

差分約束 區間選點。c

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