三步必杀 (话说这题居然被rqy秒了,% % %)
题目链接
题解链接
题目
N个柱子排成一排,一开始每个柱子损伤度为0。
接下来勇仪会进行M次攻击,每次攻击可以用4个参数l,r,s,e来描述:
表示这次攻击作用范围为第l个到第r个之间所有的柱子(包含l,r),对第一个柱子的伤害为s,对最后一个柱子的伤害为e。
攻击产生的伤害值是一个等差数列。若l=1,r=5,s=2,e=10,则对第1~5个柱子分别产生2,4,6,8,10的伤害。
鬼族们需要的是所有攻击完成之后每个柱子的损伤度。
分析
一道差分好题。
这题是一个二次差分题,这题的重点就在于第二次差分的赋值操作。
建议模拟理解。 很快就能明白。
代码 :
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e7 + 5;
int a[N], c[N], d[N], n, m;
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; ++i) {
int l, r, s, t; cin >> l >> r >> s >> t;
int mid = (t - s) / (r - l);
d[l] += s, d[l + 1] += (mid - s), d[r+1] += (-t - mid), d[r + 2] += t;
}
for(int i = 1; i <= n; ++i) {
d[i] = d[i-1] + d[i];
} int tmp = 0, ans = 0, ans2 = 0;
for(int i = 1; i <= n; ++i) {
tmp += d[i];
ans ^= tmp;
ans2 = max(ans2, tmp);
}
cout << ans << ' ' << ans2;
return 0;
}