P1250 种树

种树

题目背景

一条街的一边有几座房子,因为环保原因居民想要在路边种些树。

题目描述

路边的地区被分割成块,并被编号成 1 , 2 , … , n 1, 2, \ldots,n 1,2,,n。每个部分为一个单位尺寸大小并最多可种一棵树。

每个居民都想在门前种些树,并指定了三个号码 b b b e e e t t t。这三个数表示该居民想在地区 b b b e e e 之间(包括 b b b e e e)种至少 t t t 棵树。

居民们想种树的各自区域可以交叉。你的任务是求出能满足所有要求的最少的树的数量。

输入格式

输入的第一行是一个整数,代表区域的个数 n n n

输入的第二行是一个整数,代表房子个数 h h h

3 3 3 到第 ( h + 2 ) (h + 2) (h+2) 行,每行三个整数,第 ( i + 2 ) (i + 2) (i+2) 行的整数依次为 b i , e i , t i b_i, e_i, t_i bi,ei,ti,代表第 i i i 个居民想在 b i b_i bi e i e_i ei 之间种至少 t i t_i ti 棵树。

输出格式

输出一行一个整数,代表最少的树木个数。

样例 #1

样例输入 #1

9
4
1 4 2
4 6 2
8 9 2
3 5 2

样例输出 #1

5

提示

数据规模与约定

对于 100 % 100\% 100% 的数据,保证:

  • 1 ≤ n ≤ 3 × 1 0 4 1 \leq n \leq 3 \times 10^4 1n3×104 1 ≤ h ≤ 5 × 1 0 3 1 \leq h \leq 5 \times 10^3 1h5×103
  • 1 ≤ b i ≤ e i ≤ n 1 \leq b_i \leq e_i \leq n 1biein 1 ≤ t i ≤ e i − b i + 1 1 \leq t_i \leq e_i - b_i + 1 1tieibi+1
#include
using namespace std;
#define pii pair<int,int>
#define il inline
#define re register
#define FOR(i,n,s) for(int i=(s);i<=(n);i++) 
const int MAXN=1e5+5;
vector<pii> edges[MAXN];
int dis[MAXN];
int n,m,s;
int cnt[MAXN];
int minn=0x3f;
bool inQueue[MAXN];
queue<int> q;

//SPFA
il void add(int u,int v,int w)
{
	edges[u].emplace_back(v,w);
}
il void SPFA(int s)
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	q.push(s);
	inQueue[s]=true;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		inQueue[x]=false;
		for(auto edge:edges[x])
		{
			if(dis[edge.first]<=dis[x]+edge.second) continue;
			dis[edge.first]=dis[x]+edge.second;
			if(!inQueue[edge.first])
			{
				q.push(edge.first);
				inQueue[edge.first]=true;
			}
		}
	}
	return;
}
//

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++) 
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(v,u-1,-w);
	}
	int s=n+1;
	for(int i=0;i<=n;i++)
		add(s,i,0);
	for(int i=1;i<=n;i++)
	{
		add(i-1,i,1);
		add(i,i-1,0);
	}
	SPFA(s);
	for(int i=0;i<=n-1;i++) minn=min(minn,dis[i]);
	cout<<dis[n]-minn;
	return 0;
}

1. 设 x i 为 1 → i 种了多少棵树 1.设x_i为1\to i种了多少棵树 1.xi1i种了多少棵树
2. 则 x i − x i − 1 < = 1 , x e − x b > = t 2.则x_i-x_{i-1}<=1,x_e-x_b>=t 2.xixi1<=1xexb>=t
在此基础上,最小化 x n − x 0 在此基础上,最小化x_n-x_0 在此基础上,最小化xnx0

你可能感兴趣的:(算法,图论,c#,c++,KISS)