區間選點 差分約束系統不等式找最長路

2021-10-04 23:55:53 字數 1716 閱讀 4675

題目要求

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

input

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

output

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

sample input

53 7 3

8 10 3

6 8 1

1 3 1

10 11 1

sample output

6求解思路

使用差分約束的方法做。

**

#include

#include

#include

#define inf -1e8

using

namespace std;

struct edge};

//鏈式前向星

long

long head[

50054];

edge edge[

5000020];

long

long tot =0;

void

addedge

(long

long u,

long

long v,

long

long w)

long

long n;

long

long dis[

50054];

long

long pre[

50054];

long

long cnt[

50054];

long

long arrive[

50054];

void

spfa

(long

long s)

dis[s]=0

; arrive[s]=1

; queue<

long

long

> q;

q.push

(s);

while

(!q.

empty()

) dis[edge[i]

.v]= dis[edge[i]

.u]+ edge[i]

.w;// cout << "dis[v]=" << dis[edge[i].v]<<"v="<< edge[i].v;

// pre[edge[i].v] = edge[i].u;if(

!arrive[edge[i]

.v])}}

}}intmain()

long

long maxb =0;

for(

long

long i =

50052

; i >-5

; i--

)for

(long

long i =

0; i < n; i++

)spfa(0

);printf

("%lld"

, dis[maxb]);

//cout << maxb;

}

差分不等式

d i 1 d i 0 對於每個好感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 對於每個反感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 寫成我們約定的形式 d i d i 1 0 d j d i k d i d j k 1.對於差分不等...

差分約束 區間選點

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

區間選點 差分約束系統問題

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