Trace 2018徐州赛区网络预赛

题意:

  每次给出一个点,然后就会形成两条线,如果后面的矩形覆盖了前面的边,那么这条边就消失了, 最后求剩下的边是多少

  题目确保不会完全覆盖 也没有一个矩形在另一个矩形里面

即对于 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;
}

 

posted @ 2018-09-09 21:23  WTSRUVF  阅读(157)  评论(0编辑  收藏  举报