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

 

转载于:https://www.cnblogs.com/WTSRUVF/p/9615189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值