Codevs 1768 種樹 3 差分約束

2022-02-13 02:25:10 字數 1597 閱讀 4692

1768 種樹 3

時間限制:2 s

空間限制: 256000 kb

題目等級 :鑽石 diamond

題目描述 description

為了綠化鄉村,h村積極響應號召,開始種樹了。

h村里有n幢房屋,這些屋子的排列順序很有特點,在一條直線上。於是方便起見,我們給它們標上1~n。樹就種在房子前面的空地上。

同時,村民們向村長提出了m個意見,每個意見都是按如下格式:希望第li個房子到第ri個房子的房前至少有ci棵樹。

因為每個房屋前的空地面積有限,所以每個房屋前最多只能種ki棵樹。

村長希望在滿足村民全部要求的同時,種最少的樹以節約資金。請你幫助村長。

輸入描述 input description

輸入第1行,包含兩個整數n,m。

第2行,有n個整數ki。

第3~m+1行,每行三個整數li,ri,ci。

輸出描述 output description

輸出1個整數表示在滿足村民全部要求的情況下最少要種的樹。村民提的要求是可以全部滿足的。

樣例輸入 sample input

4 3

3 2 4 1

1 2 4

2 3 5

2 4 6

樣例輸出 sample output

8 資料範圍及提示 data size & hint

對於30%的資料,0

/*

比較簡單的差分約束.

但要注意源點的選取.

由約束條件可得

(1)dis[y+1]-dis[x]>=z.

(2)0<=dis[i]-dis[i-1]<=k[i].

因為是跑最長路.

所以要把(2)式拆成

dis[i]-dis[i-1]>=0.

dis[i-1]-dis[i]>=-k[i].

spfa鬆弛即可.

*/#include

#include

#include

#define maxn 500001

using

namespace

std;

struct datae[maxn*3];

int n,m,k[maxn],head[maxn],dis[maxn],cut;

bool b[maxn];

void add(int u,int v,int x)

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();

return x*f;

}void spfa()}}

return ;

}int main()

add(0,1,0);

for(int i=1;i<=n;i++) add(i,i+1,0),add(i,i-1,-k[i]);

spfa();

printf("%d",dis[n]);

return

0;}

2017種樹題解

每棵樹的費用為 cost i sum x i x k 由於 x i 與 x k 的大小關係的存在,我們可以把它分成兩部分 sum x i x k x i x k,1 le k le i 1 sum x k x i x i x k,1 le k le i 1 上面 1 式繼續展開 sum x i su...

洛谷1250 種樹

一條街的一邊有幾座房子。因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號為1.n。每個塊大小為乙個單位尺寸並最多可種一棵樹。每個居民想在門前種些樹並指定了三個號碼b,e,t。這三個數表示該居民想在b和e之間最少種t棵樹。當然,b e,居民必須保證在指定地區不能種多於地區被分割成塊數的...

洛谷1484 種樹

cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種 樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少 可能為負 請你幫助他 計算出他的最大獲...