原题
题目分析
分开处理,可以按起始时间给所有牛排个序,然后从小到大遍历所有牛,每遍历一头牛i就把他加入到一个优先队列中,然后从优先队列中取出结束时间最大的牛j,如果牛j的结束时间比牛i的起始时间小,那证明轮到该牛时已经可以多出一个桶了,于是可以把牛j从优先队列从弹出,并让桶的数量--,注意一下要记录一下每个牛的编号就行了.
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 typedef long long LL; 16 const int INF_INT=0x3f3f3f3f; 17 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 18 typedef pair<int,int> P; 19 20 struct G 21 { 22 int first,second,order; 23 }interval[50000]; 24 int used[50000]; 25 26 bool cmp(G a,G b) 27 { 28 return a.first<b.first; 29 } 30 31 int main() 32 { 33 // freoGen("black.in","r",stdin); 34 // freopen("black.out","w",stdout); 35 int n; 36 cin>>n; 37 for(int i=0;i<n;i++) scanf("%d %d",&interval[i].first,&interval[i].second),interval[i].order=i; 38 sort(interval,interval+n,cmp); 39 priority_queue<P,vector<P>,greater<P> > que; 40 int i=0,now=0,ans=0,cnt=0; 41 while(i<n) 42 { 43 que.push(P(interval[i].second,interval[i].order)); 44 now=interval[i].first; 45 cnt++; 46 if(que.top().first<now) used[interval[i].order]=used[que.top().second],que.pop(),cnt--; 47 else used[interval[i].order]=cnt; 48 ans=max(cnt,ans); 49 i++; 50 } 51 printf("%d\n",ans); 52 for(int i=0;i<n;i++) printf("%d\n",used[i]); 53 return 0; 54 }