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有某種神能力,能預知自己在某個坑種樹的獲利會是多少 可能為負 請你幫助他 計算出他的最大獲...