题目描述
农场有 NNN 头牛,每头牛会在一个特定的时间区间 [A,B][A, B][A,B] (包含 AAA 和 BBB ) 在畜栏里挤奶,且一个畜栏里同时只能有一头牛在挤奶。现在农场主希望知道最少几个畜栏能满足上述要求, 并要求给出每头牛被安排的方案。对于多种可行方案,输出一种即可。
输入
输入的第一行包含一个整数 NNN (1≤N≤500001 \le N \le 500001≤N≤50000), 表示有 NNN 牛头; 接下来 NNN 行每行包含两 个数,分别表示这头牛的挤奶时间 [Ai,Bi]\left[A_i, B_i \right][Ai,Bi] (1≤A≤B≤10000001 \le A \le B \le 10000001≤A≤B≤1000000) 。
输出
输出的第一行包含一个整数,表示最少需要的畜栏数:接下来 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 }
标签:NNN,le,头牛,cow,保留,问题,畜栏,now
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17455611.html