2020牛客寒假算法基础集训营6 C 汉诺塔

https://ac.nowcoder.com/acm/contest/3007/C

把x从小到大排序,问题就变成了用最少的上升序列覆盖所有的y

我的思路是每次找一个y恰好比它小的

用set实现

题解是转化成最长下降子序列长度

差不多。。。

#include<set>
#include<cstdio>
#include<iostream>
#include<algorithm>
 
using namespace std;
 
#define N 100001
 
struct node
{
    int x,y,id,ans;
}e[N];
 
struct P
{
    int y,id;
    bool operator < (P p) const
    {
        return y<p.y;
    }
};
set<P>s;
set<P>::iterator it;
 
bool cmp(node p,node q)
{
    return p.x>q.x;
}
 
bool cmp2(node p,node q)
{
    return p.id<q.id;
}
 
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i) 
    {
        scanf("%d%d",&e[i].x,&e[i].y);
        e[i].id=i;
    }
    sort(e+1,e+n+1,cmp);
    int tot=0;
    P m;
    for(int i=1;i<=n;++i)
    {
        m.y=e[i].y;
        it=s.upper_bound(m);
        if(it==s.end())
        {
             m.id=++tot;
             s.insert(m);
             e[i].ans=tot;
        }
        else
        {
            if(m.y<(*it).y)
            {
                m.id=(*it).id;
                s.erase(it);
                s.insert(m);
                e[i].ans=m.id;
            }
            else e[i].ans=(*it).id;
        }
    }
    sort(e+1,e+n+1,cmp2);
    printf("%d\n",tot);
    for(int i=1;i<=n;++i) printf("%d ",e[i].ans);
}

猜你喜欢

转载自www.cnblogs.com/TheRoadToTheGold/p/12316266.html
今日推荐