畜栏保留问题

题目描述

农场有 NNN 头牛,每头牛会在一个特定的时间区间 [A,B][A, B][A,B] (包含 AAA 和 BBB ) 在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求, 并要求给出每头牛被安排的方案。对于多种可行方案,输出一种即可。

输入

输入的第一行包含一个整数 NNN (1≤N≤500001 \le N \le 500001N50000), 表示有 NNN 牛头; 接下来 NNN 行每行包含两 个数,分别表示这头牛的挤奶时间 [Ai,Bi]\left[A_i, B_i \right][Ai,Bi] (1≤A≤B≤10000001 \le A \le B \le 10000001AB1000000) 。

输出

输出的第一行包含一个整数,表示最少需要的畜栏数:接下来 NNN 行,第 i+1i + 1i+1 行描述第 iii 头牛被分配的畜栏编号(从 111 开始)。

输入输出样例

样例输入 #1

5
1 10
2 4
3 6
5 8
4 7

样例输出 #1

4
1
2
3
2
4
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node
 4 {
 5     int st,ed,num;
 6     bool operator<(const node&w)const{
 7         return st<w.st;
 8     }
 9 }cow[100010];
10 int n,res,tmp[1000010];
11 int main()
12 {
13     cin>>n;
14     for(int i=0;i<n;i++) cin>>cow[i].st>>cow[i].ed,cow[i].num=i+1;
15     sort(cow,cow+n);
16     set<pair<int,int>>que;//使用set去重
17     for(int i=0;i<n;i++)
18     {
19         que.insert({cow[i].ed,cow[i].num});
20         pair<int,int> now=*que.begin();//注意set用法,返回的是地址,所以要加*变成值
21         if(cow[i].st>now.first) {
22             que.erase(now);
23             tmp[cow[i].num]=tmp[now.second];
24         }
25         else tmp[cow[i].num]=++res;
26     }
27     cout<<que.size()<<endl;
28     for(int i=0;i<n;i++) cout<<tmp[i+1]<<endl;
29     return 0;
30 }

 

 
posted @ 2023-06-04 14:03  o-Sakurajimamai-o  阅读(59)  评论(0)    收藏  举报
-- --