説明
これらの好き嫌いN(1 <= N <= 50,000)牛ああ!彼らは、それぞれが唯一明らかに両方の時間AとBを含むいくつかの正確な時間間隔A..B(1 <= A <= B <= 1,000,000)、上に搾乳されるようにうるさいされ、FJはに予約システムを作成する必要があります各牛が彼女の搾乳時間を割り当てることができ失速を決定します。もちろん、何の牛は他の牛と、このようなプライベートな瞬間を共有しません。
決定することによって、FJヘルプ:
決定することによって、FJヘルプ:
- 各牛が彼女のプライベート搾乳期間を持つことができるように納屋に必要な屋台の最小数
- 時間をかけてこれらの屋台への牛の割り当て
入力
1行目:単一の整数、N
行2..N + 1:回線I + 1は2スペースで区切られた整数で、私の搾乳間隔牛を説明しています。
行2..N + 1:回線I + 1は2スペースで区切られた整数で、私の搾乳間隔牛を説明しています。
出力
1行目:納屋が持たなければならない屋台の最小数。
ライン2..N + 1:回線I + 1は私が彼女の搾乳期間のために割り当てされる牛にストールを説明しています。
ライン2..N + 1:回線I + 1は私が彼女の搾乳期間のために割り当てされる牛にストールを説明しています。
サンプル入力
5
1 10
2 4
3 6
5 8
4 7
サンプル出力
4
1
2
3
2
4
ヒント
サンプルの説明:
ここでは、この出力用のグラフィカルなスケジュールです。
ここでは、この出力用のグラフィカルなスケジュールです。
時間1 2 3 4 5 6 7 8 9 10屋台の同じ番号を使用して、他の出力が可能です。
ストール1 C1 >>>>>>>>>>>>>>>>>>>>>>>>>>>
ストール2 .. C2 >>>> >> C4 >>>>>>>>> ..
ストール3 .. .. C3 >>>>>>>>> .. .. .. ..
失速4 .. .. .. C5> >>>>>>>> .. .. ..
タイトルの意味:タイトルは各納屋だけ内側に牛を搾乳しながら、ということを意味し、すべての牛は、開始時刻と終了時刻を持っています。
Q.あなたは、開始時間に等しい時間の終わりの詳細があり、すべての牛の納屋のほとんどは搾乳終了したいどのくらいかの牛の納屋に牛、
この計算交差点は、一緒に置くことはできません。
アイデア:貪欲タイトル、メンテナンス納屋、早期に最初のチームで終了時間、先出しチームの各終わりのためのプライオリティキューイング時間で。牛は納屋の中に存在していない場合
時間がこの時間の終わりよりも大きい起動し、その後、チームの中にこれらの牛、終了時間のうち、終了時間をチームに入れました。
納屋に入って来たシリアル番号で頭当たり出力すべきトピック、考えると、我々はどのような納屋を記録し、最終的には序ソート出力を押す必要があります
。
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 #include<list>
11 #include<stack>
12 //#include<unordered_map>
13 using namespace std;
14 #define ll long long
15 #define dd cout<<endl
16 const int mod=1e9+7;
17 const int nf=1e9+7;
18
19 const int maxn=5e4+10;
20
21 typedef struct
22 {
23 int a;
24 int b;
25 int number;
26 } St;
27 //优先队列+结构体,定义优先级
28 bool operator<(const St &x,const St &y)
29 {
30 return x.b > y.b;
31 }
32
33 bool cmp(const St &x,const St &y)
34 {
35 if(x.a != y.a)
36 return x.a < y.a;
37 else
38 return x.b < y.b;
39 }
40
41 St sum[maxn];
42
43 int main()
44 {
45 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
46
47 int n;
48 cin>>n;
49
50 int a,b;
51
52 priority_queue<St>q;
53
54 int ans=0;
55 vector<St>v;
56
57 for(int i=0;i<n;i++)
58 {
59 cin>>sum[i].a>>sum[i].b;
60 sum[i].number=i;
61 }
62
63 sort(sum,sum+n,cmp);//这里先根据开始顺序排下序
64
65 for(int i=0;i<n;i++)
66 {
67 a=sum[i].a;//当前开始时间
68 b=sum[i].b;//当前结束时间
69
70 if(q.empty())//空的直接进篱笆
71 {
72 ans++;
73 q.push({ans,b});
74 v.push_back({sum[i].number,ans});//记录
75 }
76 else
77 {
78 St now=q.top();
79
80 if(now.b < a)//当前开始时间大于最早的结束时间
81 {
82 q.pop();
83
84 v.push_back({sum[i].number,now.a});//记录
85 q.push({now.a,b});
86 }
87 else//在进一个篱笆
88 {
89 ans++;
90 q.push({ans,b});
91 v.push_back({sum[i].number,ans});//记录
92 }
93 }
94 }
95
96 cout<<ans<<endl;//篱笆数
97
98 sort(v.begin(),v.end(),cmp);//按奶牛序号排序
99
100 for(int i=0;i<v.size();i++)//输出答案
101 cout<<v[i].b<<endl;
102
103 return 0;
104 }