POJ 3190 Stall Reservations

xiaoxiao2021-02-28  23

题目链接:点击打开链接

Stall Reservations Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9610 Accepted: 3363 Special Judge

Description

Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.  Help FJ by determining: The minimum number of stalls required in the barn so that each cow can have her private milking periodAn assignment of cows to these stalls over timeMany answers are correct for each test dataset; a program will grade your answer.

Input

Line 1: A single integer, N  Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.

Output

Line 1: The minimum number of stalls the barn must have.  Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.

Sample Input

5 1 10 2 4 3 6 5 8 4 7

Sample Output

4 1 2 3 2 4

Hint

Explanation of the sample:  Here's a graphical schedule for this output:  Time 1 2 3 4 5 6 7 8 9 10 Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>> Stall 2 .. c2>>>>>> c4>>>>>>>>> .. .. Stall 3 .. .. c3>>>>>>>>> .. .. .. .. Stall 4 .. .. .. c5>>>>>>>>> .. .. ..Other outputs using the same number of stalls are possible.

Source

USACO 2006 February Silver

#include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <algorithm> #include <iostream> #include <map> #include <vector> using namespace std; struct part { int l; int r; int num; int num1; }; struct part a[100000],heap[500000]; int i,n,ans,len,c[100000]; struct part p; void jian(struct part m) { int fa; struct part p; len+=1; heap[len]=m; fa=len; while (fa/2>=1) { if (heap[fa].r<heap[fa/2].r) { p=heap[fa]; heap[fa]=heap[fa/2]; heap[fa/2]=p; fa/=2; } else break; } } struct part get() { int fa,son; struct part p,k; k=heap[1]; heap[1]=heap[len]; len-=1; fa=1; while (fa*2<=len) { son=fa*2; if (son+1<=len&&heap[son+1].r<heap[son].r) son+=1; if (heap[son].r<heap[fa].r) { p=heap[son]; heap[son]=heap[fa]; heap[fa]=p; fa=son; } else break; } return(k); } bool cmp(struct part p,struct part q) { if (p.l==q.l) return(p.r<q.r); return(p.l<q.l); } int main() { scanf("%d",&n); for (i=0;i<=n-1;i++) { scanf("%d%d",&a[i].l,&a[i].r); a[i].num=0; a[i].num1=i; } sort(a,a+n,cmp); len=0; ans=0; for (i=0;i<=n-1;i++) { if (len==0) {ans+=1; a[i].num=ans; jian(a[i]);} else if (heap[1].r<a[i].l) { p=get(); a[i].num=p.num; jian(a[i]); } else { ans+=1; a[i].num=ans; jian(a[i]); } } for (i=0;i<=n-1;i++) c[a[i].num1]=i; printf("%d\n",ans); for (i=0;i<=n-1;i++) printf("%d\n",a[c[i]].num); return(0); }PS:堆贪心和区间贪心,注意一下排序的处理,继续加油!
转载请注明原文地址: https://www.6miu.com/read-2625303.html

最新回复(0)