4. 种树

trees.pas/c/cpp

【问题描述】

一条街的一边有几座房子。因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号为1..n。每个块的大小为一个单位尺寸并最多可种一棵树。每个居民想在门前种些树并指定了三个号码b,e,t。这三个数表示该居民想在b和e之间最少种t棵树。当然,b<=e,居民必须保证在指定地区不能种多于地区被分割成块数的树,即要求t<=e-b+1。允许居民想种树的各自区域可以交叉。出于资金短缺的原因,环保部门请你求出能够满足所有居民的要求,需要种树的最少数量。

 

【文件输入】

第一行为n,表示区域的个数;

第二行为h,表示房子的数目;

下面h行描述居民的需要:b e t (0<b<=e<=30000,r<=e-b+1) 分别用一个空格分开。

 

【文件输出】

输出为满足所有要求的最少树的数量。

 

【样例输入】

9

4

1 4 2

4 6 2

8 9 2

3 5 2

 

【样例输出】

5

 

【数据规模】

30%的数据满足0<n<=1000;0<h<=500

100%的数据满足n<=30000;h<=5000

此题乃差分约束裸题,只恨当时不会啊。

令a[i]表示i位置有没有放种树,令s[i]表示a数列的前缀和,则对于题目输入的一系列b,e,t转化为一系列不等式s[e] - s[b - 1] >= t,很显然这就是一个差分约束系统。把不等式写成大于等于的形式,是因为这样子就是求最长路,求最长路得出的结果就是最小的一组解集,求最短路得出的结果就是最大的一组解集,不予证明。注意还有两个条件,对于任意的i,s[i] - s[i - 1] >= 0,s[i - 1] - s[i] >= -1.

#include <cstdio>
#include <cstring> const int maxn = 30005, maxe = 80005; int n, h, t1, t2, t3;
int head[maxn], to[maxe], next[maxe], w[maxe], lb;
int que[maxn], head_, tail, d[maxn];
bool inq[maxn]; inline void ist(int aa, int ss, int ww) {
to[lb] = ss;
next[lb] = head[aa];
head[aa] = lb;
w[lb] = ww;
++lb;
} int main(void) {
freopen("trees.in", "r", stdin);
freopen("trees.out", "w", stdout);
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
scanf("%d", &n);
scanf("%d", &h);
while (h--) {
scanf("%d%d%d", &t1, &t2, &t3);
ist(t1 - 1, t2, t3);
}
for (int i = 0; i < n; ++i) {
ist(i, i + 1, 0);
ist(i + 1, i, -1);
} memset(d, -0x3c, sizeof d);
que[tail++] = 0;
inq[0] = true;
d[0] = 0;
while (head_ != tail) {
h = que[head_++];
inq[h] = false;
if (head_ == n + 1) {
head_ = 0;
}
for (int j = head[h]; j != -1; j = next[j]) {
if (d[to[j]] < d[h] + w[j]) {
d[to[j]] = d[h] + w[j];
if (!inq[to[j]]) {
inq[to[j]] = true;
que[tail++] = to[j];
if (tail == n + 1) {
tail = 0;
}
}
}
}
}
printf("%d\n", d[n]);
return 0;
}

  

[ZPG TEST 115] 种树【差分约束】的更多相关文章

  1. 算法复习——差分约束(ssoi种树)

    题目: 题目描述 为了绿化乡村,H 村积极响应号召,开始种树了. H 村里有 n 幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上 1-n .树就种在房子前面的空地上. ...

  2. Codevs 1768 种树 3(差分约束)

    1768 种树 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 为了绿化乡村,H村积极响应号召,开始种树了. H村里有n幢 ...

  3. P1250 种树(差分约束 / 贪心)

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1-N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E,T ...

  4. 题解——洛谷P1250 种树(差分约束)

    一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...

  5. 【最短路·差分约束】洛谷P1250

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  6. 最短路 & 差分约束 总结

     一.引例      1.一类不等式组的解 二.最短路       1.Dijkstra       2.图的存储       3.链式前向星       4.Dijkstra + 优先队列      ...

  7. [hdu4598]二分图判定,差分约束

    题意: 给一个图,问能否给每个点分配一个实数值,使得存在一个数实数T,所有点满足:|value(i)| < T 且 u,v之间有边<=> |value(u)-value(v)| &g ...

  8. Candies-POJ3159差分约束

    Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...

  9. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

随机推荐

  1. linux的bc命令介绍

    bc命令是一种支持任意精度的交互执行的计算器语言.bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下. 算术操作高级运算bc命令它可以 ...

  2. C#编程语言及.NET 平台快速入门指南

    github: https://github.com/mfjiang e-mail: hamlet.jiang@live.com   ⼀.C#,CLR,IL,JIT概念 以及 .NET 家族 (⼀)基 ...

  3. 转: java DES的算法片码

    转自: https://www.zhihu.com/question/36767829 作者:郭无心链接:https://www.zhihu.com/question/36767829/answer/ ...

  4. VS2015 android 设计器不能可视化问题解决。

    近期安装了VS2015,体验了一下android 的开发,按模板创建执行了个,试下效果非常不错.也能够可视化设计.但昨天再次打开或创建一个android程序后,设计界面直接不能显示,显示错误:(可能是 ...

  5. Office2010,PPT,EXCEL如何插入日历控件

    1 在Office2010中插入其他控件,然后找到日历控件   2 十字架随便在Excel中绘制一下,得到一个日历控件,注意此时还是在设计模式下,在设计模式下日历控件不是正常状态,你还是可以双击这个控 ...

  6. Visual Studio VS如何修改代码字体

    工具-选项-环境-字体和颜色

  7. Python开发【1.1 基础语法】

    1.Python语言特点 优点: ①.丰富的库 ②.简单.开源 ③.支持面向对象编程 ④.解释性语言,无需编译 ⑤.高层语言,不用考虑内存问题 ⑥.可移植性好,不依赖于操作系统 缺点: ①.运行效率较 ...

  8. mysql14---手动备份

    PHP定时完成数据库的备份 1.手动备份数据库(表的)方法 cmd控制台(windows指令): mysqldump –u root –proot 数据库 [表名1 表名2..] > 文件路径 ...

  9. [10.26_P2] 最短路 (单源最短路应用)

    单源最短路问题拓展 Description 给你一张图,图上有 n 个点,m 条边,要你找到两个点,使其最短路恰好包含给定的 k 个点.输出这条最短路的长度,输入保证有解. 输入格式 第一行两个数 n ...

  10. 通过查询数据库中的数据匹配在页面上:(set单条数据属性是在页面上的显示与foreach的不同) 通过ID修改提取位置表信息

    ACTION   OpenModifyExtractPositionById // set单条数据属性 /* * 通过ID修改提取位置表信息 */ public String OpenModifyEx ...