浴谷1645 序列(差分約束系統)

2021-08-23 14:10:21 字數 1863 閱讀 8771

有乙個整數序列,它的每個數各不相同,我們不知道它的長度是多少(即整數個數),但我們知道在某些區間中間至少有多少個整數,用區間(li,ri,ci)來描述,表示這個整數序列中至少有ci個數來自區間[li,ri],給出若干個這樣的區間,問這個整數序列的長度最少能為多少?

輸入格式:

第一行乙個整數n,表示區間個數;

接下來n行,每行三個整數(li,ri,ci),描述乙個區間。

【資料規模】

n<=1000,0<=li<=ri<=1000,1<=ci<=ri-li+1

輸出格式:

僅乙個數,表示該整數序列的最小長度。

輸入樣例#1:複製

4

4 5 1

6 10 3

7 10 3

5 6 1

輸出樣例#1:複製

4
以前看過這個演算法,不過沒做過題,今天算是做到入門題吧。

差分約束系統最難的就是建模,如何根據已知的不等式構造出聯通圖。

因為題目要求的是最小值,所以我們要在構造的圖中求最長路。

假設現在有區間【l , r】,且最少有x個數。我們可以得到不等式 r-l+1>=x,即我們要構造addedge(l,r+1,x)這樣的一條邊.

當然,根據已知的條件構造出的圖可能是不連通的,所以我們還需要找題目中隱藏的不等式條件來使得建模後的圖一定聯通,並且可以求出最長路。

隱藏的不等式?

當左右區間相等時,我們可以得到這樣的乙個不等式  0<=r-l+1<=1,所以又可以構造兩條邊 addedge(l,r+1,0),addedge(r+1,l,-1)。

這樣我們就保證了圖的連通性。

一開始做此題的時候,想法是將不等式左邊的1移到右邊構造addedge(l,r,x-1)的邊,可是這樣是錯誤的。

想了許久,只能找到這樣的反例,在隱藏的不等式裡,如果這樣加邊,仍然不能保證圖的可連通性。

不知這樣想是否正確,如果有路過的大佬,還敬請指點一二,證明一番。

/*#include#include#include#include#include#include#include#include#include#define max(a,b)   (a>b?a:b)

#define min(a,b) (apa;

const int maxl(1000);

const int inf(0x3f3f3f3f);

const int mod(1e9+7);

int dir[4][2]= ,,,};

struct node

nod;

vectorv[maxl+50];

int vis[maxl+50];

int dis[maxl+50];

void addedge(int x,int y,int w));}

int spfa(int u,int ma)

,,,};

struct node

edge[maxl+50];

int head[maxl+50];

int vis[maxl+50];

int dis[maxl+50];

int cnt=0;

void addedge(int x,int y,int w)

int spfa(int u,int ma)}}

}return dis[ma];

}int main()

for(int i=mi;iint ans=spfa(mi,ma);

cout<}

洛谷 P1645 序列

炒雞明顯的貪心題,主要就想讓一段區間與另一段裡面重合的數越多越好。於是先按照區間右端排序,然後盡可能的把數都往右靠攏,最後與另一段區間的前面的重合。然後可以用個flag來記錄哪些數被選了什麼的。include includeusing namespace std const int maxn 100...

洛谷1993 小K的農場(差分約束系統模板題)

點此看題面 大致題意 給你若干組不等式,請你判斷它們是否有解。差分約束系統 看到若干組不等式,應該很容易想到差分約束系統吧。l in klink link 差分約束系統詳見部落格 差分約束系統 a b c a b c a b c 轉換可得a b c a b c a b ca b c a b c a ...

洛谷P1993 小K的農場 差分約束系統

題目傳送門 小k在mc裡面建立很多很多的農場,總共n個,以至於他自己都忘記了每個農場中種植作物的具體數量了,他只記得一些含糊的資訊 共m個 以下列三種形式描述 但是,由於小k的記憶有些偏差,所以他想要知道存不存在一種情況,使得農場的種植作物數量與他記憶中的所有資訊吻合。輸入格式 第一行包括兩個整數 ...