题意:
每次给出一个点,然后就会形成两条线,如果后面的矩形覆盖了前面的边,那么这条边就消失了, 最后求剩下的边是多少
题目确保不会完全覆盖 也没有一个矩形在另一个矩形里面
即对于 X1,Y1 X2,Y2
如果X1 > X2 则 Y1 < Y2
如果X1 < X2 则 Y1 > Y2
这样才会保证不会出现包含的情况
解析:
分别求x 和 y
我们只看x就好了
从后往前 用set维护 对于v[i] 如果set里存在比v[i]小的数 则说明在加入这个矩形后加入的矩形 会覆盖这个矩形x长度的一部分 所以在加这条边的长度的时候 我们要减去被覆盖的长度 就是从set里找到与当前v[i]最接近 且 小于当前v[i]的值
如果都比当前v[i]大 说明不被覆盖
注意lower_bound返回时 如果set里都比当前v[i]小 则返回end()
#include <bits/stdc++.h> using namespace std; typedef long long LL; vector<int> v1; vector<int> v2; LL solve(vector<int> v) { LL res = 0; set<int> s; int len = v.size(); for(int i=len-1; i>=0; i--) { set<int>::iterator it = s.lower_bound(v[i]); if(it == s.begin()) { res += v[i]; } else { it--; res += v[i] - *it; } s.insert(v[i]); } return res; } int main() { int n, x, y; while(cin>> n) { v1.clear(), v2.clear(); for(int i=0; i<n; i++) { cin>> x >> y; v1.push_back(x); v2.push_back(y); } cout<< solve(v1) + solve(v2) <<endl; } return 0; }