解题思路
水题,暴力都能 AC…
首先扫描所有格,我们可以把所有三角形(包括完整的三角形和和其它三角形重叠的)都看成梯形处理。
我们枚举下梯形斜边上的所有整点,算出所有梯形面积即可。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int x[N], m[N], cnt[N], maxx[N];
vector<int> line[N];
int main() {
ios :: sync_with_stdio(0);
int n, maxy = -1;
cin >> n;
for (int i = 1; i <= n; ++i) {
int y;
cin >> x[i] >> y >> m[i];
maxy = max(maxy, y + m[i]);
line[y].push_back(i);
}
int diff = 0;
long long res = 0;
for (int i = 0; i <= maxy; ++i) {
res += 1ll * ((diff << 1) - cnt[i]);
diff -= cnt[i];
for (auto& idx: line[i]) {
for (int j = 0; j < m[idx]; ++j) {
#define X maxx[x[idx] + j]
int t = m[idx] + i - j;
if (t > X) {
diff += X <= i;
--cnt[X];
++cnt[X = t];
}
}
}
}
cout << fixed << setprecision(1) << res / 2.0 << '\n';
return 0;
}