Codeforce 22D Segments

题意:

    存在n个区间,我们至少能用多少个点将这几个区间固定住。

解析:

    我们可以对所有的线段进行一次排序:

    bool operator<(const Node &a)const
    {
        if(a.l==l)return r>a.r;
        return l<a.l;

    }

    我们就需要不断往数组中推入新的点。并更新。

1.如果数组顶的结点可以固定这个线段那么我只直接去询问下一个就可以了。

2.如果当前线段的右端点小于数组顶的元素我们可以将该元素缩小。(因为我们是按照l进行排序的所以我们缩小后的点之前满足的一样满足)

3.如果当前线段的左端点大于数组顶的元素,我们就往数组中推入一个元素。

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int l,r;
    bool operator<(const Node &a)const
    {
        if(a.l==l)return r>a.r;
        return l<a.l;
    }
} a[1005];
vector<int>v;
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>a[i].l>>a[i].r;
        if(a[i].r<a[i].l)swap(a[i].l,a[i].r);
    }
    sort(a,a+n);
    int T=0;
    v.push_back(a[0].r);
    for(int i=1;i<n;i++){
        if(a[i].r>=v[v.size()-1]&&a[i].l<=v[v.size()-1])continue;
        else if(a[i].r<v[v.size()-1])v[v.size()-1]=a[i].r;
        else v.push_back(a[i].r);
    }
    printf("%d\n",v.size());
    for(int i=0;i<v.size();i++)cout<<v[i]<<" ";
    cout<<endl;
}

猜你喜欢

转载自blog.csdn.net/lj130lj/article/details/79950348