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