森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过Ci​公斤。

公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从Sj​号城市运输到Tj​号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中途卸货。

为了让公司整体效益更佳,森森想知道如何安排订单的运输,能使得运输的货物重量最大且符合道路的限制?要注意的是,发货时间有可能是任何时刻,所以我们安排订单的时候,必须保证共用同一条道路的所有货车的总重量不超载。例如我们安排1号城市到4号城市以及2号城市到4号城市两张订单的运输,则这两张订单的运输同时受2-3以及3-4两条道路的限制,因为两张订单的货物可能会同时在这些道路上运输。

输入格式:

输入在第一行给出两个正整数NQ(2≤N≤105, 1≤Q≤105),表示总共的城市数以及订单数量。

第二行给出(N−1)个数,顺次表示相邻两城市间的道路允许的最大运货重量Ci​(i=0,⋯,N−2)。题目保证每个Ci​是不超过231的非负整数。

接下来Q行,每行给出一张订单的起始及终止运输城市编号。题目保证所有编号合法,并且不存在起点和终点重合的情况。

输出格式:

在一行中输出可运输货物的最大重量。

输入样例:

10 6
0 7 8 5 2 3 1 9 10
0 9
1 8
2 7
6 3
4 5
4 2

输出样例:

7

样例提示:我们选择执行最后两张订单,即把5公斤货从城市4运到城市2,并且把2公斤货从城市4运到城市5,就可以得到最大运输量7公斤。

分析:每个路程受到其中最小承重量限制,不同的运输路线[a, b],[c,d]之间有3种关系 1.[a, b]与[c,d]无交集,则可以同时进行两个运输订单 2.如果一个路线包含于另一个路线中,那么选择少的那一段显然更优 3.[a, b]与[c,d]存在交集,交集为[c,b],则能最大运输货物重量为min([c,b],[a,c] + [b,d]。 综上,我们可以将点坐标,按照右端点从小到大的顺序排列,相等的情况下,按照左端点从小到大的顺序排列。只需要建立一棵具有区间加以及区间最小值的线段树即可,符合结分配合律,故不需要lazy数组。遍历排序后的接线信息,每个路线取到最大运输货物后,减少本线路的通货承重量,即可得到最终答案~

注意:输入的路线起始与结束不一定小的在前面,大的在后面~

#include<bits/stdc++.h>
#define Lx(a) (a << 1) + 1
#define Rx(a) (a << 1) + 2
using namespace std;
int n, m, Size;
long long ans, temp;
pair<int, int> B[100000];
struct segtree {vector<long long> values, mins;void init(int n) {Size = 1;while (Size < n) Size *= 2;values.assign(2 * Size, 0LL);mins.assign(2 * Size, 0LL);build(0, 0, Size, n);}void build(int x, int lx, int rx, int R) {if (rx - lx == 1) {if (lx < R) {cin >> mins[x];values[x] = mins[x];}return;}int mid = lx + rx >> 1;build(Lx(x), lx, mid, R);build(Rx(x), mid, rx, R);mins[x] = min(mins[Lx(x)], mins[Rx(x)]) + values[x];}void modify(int l, int r, int v, int x, int lx, int rx) {if (lx >= r || rx <= l) return;if (lx >= l && rx <= r) {mins[x] += v;values[x] += v;return;}int mid = lx + rx >> 1;modify(l, r, v, Lx(x), lx, mid);modify(l, r, v, Rx(x), mid, rx);mins[x] = min(mins[Lx(x)], mins[Rx(x)]) + values[x];return;}long long get_min(int l, int r, int x, int lx, int rx) {if (lx >= r || rx <= l) return LLONG_MAX;if (lx >= l && rx <= r) return mins[x];int mid = lx + rx >> 1;long long s1 = get_min(l, r, Lx(x), lx, mid);long long s2 = get_min(l, r, Rx(x), mid, rx);return min(s1, s2) + values[x];}
}st;
bool cmp (const pair<int, int> &a, const pair<int, int> &b) {if (a.second != b.second) return a.second < b.second;return a.first < b.first;
}
int main() {cin >> n >> m;st.init(--n);for (int i = 0; i < m; i++) {cin >> B[i].first >> B[i].second;if (B[i].first > B[i].second) swap(B[i].first, B[i].second);}sort(B, B + m, cmp);for (int i = 0; i < m; i++) {temp = st.get_min(B[i].first, B[i].second, 0, 0, Size);ans += temp;st.modify(B[i].first, B[i].second, -temp, 0, 0, Size);}cout << ans;return 0;
}

L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-028 森森旅游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    好久没出去旅游啦!森森决定去 Z 省旅游一下. Z 省有 n 座城市(从 1 到 n 编号)以及 m 条连接两座城市的有向旅行线路(例如自驾.长途汽车.火车.飞机.轮船等),每次经过一条旅行线路时都需 ...

  2. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

  5. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  6. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  7. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  8. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  9. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

最新文章

  1. python八:列表(list)
  2. Java8多线程ForkJoinPool:处理异常
  3. [html] 开发静态页面时,不依赖node相关的工具,如何提取出公共部分并引入?
  4. MagicRecord For IOS API深层解析
  5. leetcode 142 --- linked-list-cycle-ii
  6. php 合并数组 效率,PHP将两个关联数组合并函数-增高函数效率
  7. eclipse报错:An error has occurred. See error log for more details. java.lang.NullPointerException
  8. SpringBoot启动流程解析
  9. CICD和K8S实战
  10. python pathos_python运行多线程库pathos时,pymongo递归深度溢出
  11. 前台如何正确接收流信息_如何绕过 Android 8.0 startService 限制?
  12. double类型数据做加和操作时会丢失精度问题处理
  13. Microsoft visual FoxPro使用教程--添加csv文件数据到dbf文件中
  14. ECharts类图表数据实时更新
  15. Android 使用数据库操作应用加锁、未加锁,列表展示效果
  16. 锁的等级:方法锁、对象锁、类锁
  17. 免Root–获取WIFI密码
  18. python计算偶数平方和_如何使用Python和Numpy计算r平方?
  19. C语言求:歌德巴赫猜想
  20. 计算机技术考研科目大纲,2017计算机考研大纲:计算机大纲文字完整版

热门文章

  1. 从主机名谈Hadoop集群管理
  2. android signal 处理总结
  3. Toast-Android 专属浮动小提示
  4. Rancher体系下容器日志采集
  5. 如何提高网络安全指数
  6. MyBatis6:MyBatis集成Spring事物管理(下篇)
  7. Python操作Redis和Memcached
  8. HTML5体感游戏《守护拉普达》诞生记
  9. PL/SQL程序设计 第四章 游标的使用
  10. 10条建议让你创建更好的jQuery插件(转载)