#19280. 明长城
明长城
你好!我是你的OI金牌教练。
上一题我们学习了前缀和(用于快速进行区间求和)。今天,我们把目光转向明朝,结合 “明长城与边防” 的历史背景,学习前缀和的“逆运算”——差分数组 (Difference Array)。
这是 GESP 6级 乃至更高阶竞赛中处理区间修改问题的核心技巧。
第一部分:背景知识讲解
1. 明长城 (The Great Wall of Ming Dynasty)
我们今天看到的宏伟长城,大部分修筑于明朝。为了防御北方游牧民族(如鞑靼、瓦剌)的南下,明朝政府不仅修筑了高大的城墙,还建立了完善的防御体系,称为“九边重镇”。
2. 驻军与调防
长城防线绵延万里,并非每一处的兵力都是固定的。
- 平时:各关口有固定的守军。
- 战时:当某一段防线收到敌情预警时,朝廷会下令向该路段增兵。
- 特征:增兵通常是成段进行的。例如:“命令从山海关到居庸关这一段,所有烽火台各增兵 100 人。”
3. 算法痛点
如果边境频繁告急,大将军不断下达“区间增兵”的指令,我们需要快速计算出最终每一座烽火台的兵力情况,以便找出防守最薄弱的环节。
第二部分:题目内容
题目名称:长城防线 (Great Wall Defense)
题目描述
明朝的边境防线由 座烽火台组成,它们顺次编号为 到 。 起初,为了整修工事,所有烽火台的驻军数量都为 。
随着边境局势变化,兵部连续下达了 次增兵令。 第 次增兵令包含三个整数 ,表示:从第 座烽火台到第 座烽火台(包含 和 ),每一座烽火台都需要增加 名士兵。
在大将军戚继光执行完这 次增兵令后,他需要视察防线,找出目前兵力最薄弱(士兵数量最少)的那一座烽火台,以及它的兵力是多少。
请你编写程序,计算出所有烽火台最终的兵力值,并输出其中的最小值。
输入格式
第一行包含两个正整数 。
- 表示烽火台的数量。
- 表示增兵令的数量。
接下来 行,每行包含三个正整数 。
- 表示一次增兵操作:区间 内每个点加 。
输出格式
输出一行一个整数,表示执行完所有命令后,整条防线上兵力最少的烽火台的士兵数量。
输入输出样例 #1
输入:
5 3
1 3 2
2 4 3
3 5 1
输出:
1
样例 #1 解释:
初始:[0, 0, 0, 0, 0]
- 指令
1 3 2:烽火台 1~3 各加 2。- 兵力变更为:
[2, 2, 2, 0, 0]
- 兵力变更为:
- 指令
2 4 3:烽火台 2~4 各加 3。- 兵力变更为:
[2, 5, 5, 3, 0]
- 兵力变更为:
- 指令
3 5 1:烽火台 3~5 各加 1。- 兵力变更为:
[2, 5, 6, 4, 1]
- 兵力变更为:
最终兵力为 2, 5, 6, 4, 1。
最少的是第 5 座烽火台,兵力为 1。
数据范围
对于 的数据:
- 最终兵力值保证在
long long范围内(实际上本题 内,int 勉强够,但推荐 long long)。