按照吃草时间排序 之后我们用 优先队列维护一个结束时间 每次比较堆顶 看是否满足 满足更新后放到里面不满足就在后面添加
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; const int maxn=60000; int n,c[maxn]; struct ac{ int l,r,z; bool operator <(const ac &a)const { if(r==a.r) return l>a.l; return r>a.r; } }a[maxn]; priority_queue<ac> q; bool cmp(ac a,ac b){ if(a.l==b.l) return a.r<b.r; return a.l<b.l; } int main(){ cin>>n; for(int i=0;i<n;i++){ scanf("%d%d",&a[i].l,&a[i].r); a[i].z=i; } sort(a,a+n,cmp); q.push(a[0]); int ll=0,len=1; c[a[0].z]=1; for(int i=1;i<n;i++){ if(!q.empty()&&q.top().r<a[i].l){ c[a[i].z]=c[q.top().z]; q.pop(); }else{ len++; c[a[i].z]=len; } q.push(a[i]); } printf("%d\n",len); for(int i=0;i<n;i++) printf("%d\n",c[i]); return 0; }