种树
题目背景
一条街的一边有几座房子,因为环保原因居民想要在路边种些树。
题目描述
1
,
2
,
…
,
n
1,2,…,n。每个部分为一个单位尺寸大小并最多可种一棵树。
b
b
b,
e
e
e,
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)
(
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
1
≤
h
≤
5
×
1
0
3
1 leq h leq 5 times 10^3
-
1
≤
b
i
≤
e
i
≤
n
1 leq b_i leq e_i leq n
1
≤
t
i
≤
e
i
−
b
i
+
1
1 leq t_i leq e_i – b_i + 1
#include<bits/stdc++.h>
using namespace std;
struct aty {
int v,w;
};
vector<aty> E[100010];
queue<int> q;
int n,m,dis[100010],u,v,w,fw[100010],op,c,s[100010];
bool vis[100010];
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++) {
scanf("%d%d%d",&u,&v,&w);
E[u-1].push_back({v,w});
}
for(int i=1; i<=n; i++) {
dis[i]=-INT_MAX;
E[i].push_back({i-1,-1});
E[i-1].push_back({i,0});
}
dis[0]=0;
// fw[0]=1;
q.push(0);
while(!q.empty()) {
int u=q.front();
q.pop();
vis[u]=false;
for(int i=0; i<E[u].size(); i++) {
if(dis[u]+E[u][i].w>dis[E[u][i].v]) {
dis[E[u][i].v]=dis[u]+E[u][i].w;
if(!vis[E[u][i].v]) {
q.push(E[u][i].v);
vis[E[u][i].v]=1;
}
}
}
}
printf("%d",dis[n]);
return 0;
}
原文地址:https://blog.csdn.net/m0_61360607/article/details/134557030
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_4397.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!