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;
}

猜你喜欢

转载自www.cnblogs.com/zgglj-com/p/9638251.html