Trace - 计蒜客
ps:注意不存在一个矩形包含另一个矩形的情况。那么最终图形的轮廓,一定是阶梯状的。
那么怎么算贡献呢?因为我们知道最终的轮廓,所以倒着来,假设当前处理矩形A(x,y),那么如果存在B(x1,y1),y1 < y(因为不存在包含的关系,所以x1 > x),则 A对答案的最终贡献是 : y - y1,仔细推敲,因为倒着来,所以是先画矩形A,再画矩形B,那么B就会遮挡矩形A的一部分。显然可能会存在多个B,选哪个B呢?选离A最近的那个(图中B1)
因为不存在一个矩形包含另一个矩形,所以上述做法能保证正确性。(很考思维的一道题:感觉很多题思维上总有递推的关系,总的贡献由一些小贡献按照某种顺序累加得到!)
int n; vector<int> x, y; LL Solve(vector<int> &tp) { set<int> s; LL res = 0; for (int i = n - 1; ~i; --i) { auto sp = s.lower_bound(tp[i]); if (sp == s.begin()) res += tp[i]; else { sp--; res += (tp[i] - *sp); } s.insert(tp[i]); } return res; } int main() { cin >> n; int u, v; Rep(i, 1, n) { cin >> u >> v; x.pb(u), y.pb(v); } LL ans = 0; ans += Solve(x); ans += Solve(y); cout << ans << endl; return 0; }