種樹 差分約束 貪心

2021-09-17 03:35:14 字數 1142 閱讀 5345

先看貪心版本。

每次種的樹在重疊區間越多,種的樹越少。只有結束位置才會重合,就對區間結束的位置從小到大排序。

然後遍歷每個區間統計第i個區間種了k個樹,若k大於 t ,則continue, 否則從區間末尾往前種樹。 

//貪心種樹 

#include using namespace std;

struct n

} }printf("%d\n",ans);

return 0;

}

差分約束

題目中有這麼幾個約束條件

sum[i]是 i 的字首和。

從u到v: sum[u-1] - sum[v] <= - t

從i-1到i:   sum[i] - sum[i-1] <=1  

從i到i-1:   sum[i-1] - sum[ i ]<=0

最後找乙個源點也即n+1,n+1到每個點距離為0   sum[i] - sum[n+1]=0

//差分種樹 

#include using namespace std;

#define inf 0x7fffffff

#define r register

struct n;

int cnt,n,m;

int s;

n edge[100005];

int head[100005],dis[30005],book[30005];

int read()

while(c>='0'&&c<='9')

return x*dign;

}void add(int u,int v,int w)

void spfa()

} } }

}int main()

for(r int i=1;i<=n;i++)

for(r int i=0;i<=n;i++)add(n+1,i,0);

s = n+1;

spfa();

int mi = inf;

for(int i=0;i<=n;i++)mi = min(mi,dis[i]);

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

return 0;

}

種樹(差分約束)

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

差分約束 種樹

題目鏈結 一條街的一邊有幾座房子,因為環保原因居民想要在路邊種些樹。路邊的地區被分割成塊,並被編號成 1,2,n。每個部分為乙個單位尺寸大小並最多可種一棵樹。每個居民都想在門前種些樹,並指定了三個號碼 b,e,t。這三個數表示該居民想在地區 b 和 e 之間 包括 b 和 e 種至少 t 棵樹。居民...

種樹(一道簡單的差分約束系統)

為了綠化鄉村,h村積極響應號召,開始種樹了。h村里有n幢房屋,這些屋子的排列順序很有特點,在一條直線上。於是方便起見,我們給它們標上1 n。樹就種在房子前面的空地上。同時,村民們向村長提出了m個意見,每個意見都是按如下格式 希望第li個房子到第ri個房子的房前至少有ci棵樹。因為每個房屋前的空地面積...