题意:o-
思路:首先我是很暴力的贪心,然后意料之中TLE。然后参考网上的优化,用了优先队列。
代码附上:
#include <stdio.h>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#define FIN freopen("input.txt","r",stdin)
using namespace std;
typedef long long ll;
const int MAX=50005;
struct node{
int begin,end,index;
bool operator<(const node &a) const{
return begin==a.begin?end>a.end:begin<a.begin;
}
}a[MAX];
struct stall{
int id,end;
bool operator<(const stall& b) const{
return end>b.end;
}
}b[MAX];
int n,index[MAX];
int main(){
//FIN;
while(~scanf("%d",&n)){
priority_queue<stall>que;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].begin,&a[i].end);
a[i].index=i;
}
sort(a,a+n);
b[0].id=1;b[0].end=a[0].end;
que.push(b[0]);index[a[0].index]=1;
for(int i=1;i<n;i++){
b[i].end=a[i].end;
if(a[i].begin<=que.top().end) {b[i].id=que.size()+1;}
else {b[i].id=que.top().id;que.pop();}
index[a[i].index]=b[i].id;
que.push(b[i]);
}
printf("%d\n",que.size());
for(int i=0;i<n;i++){
printf("%d\n",index[i]);
}
}
return 0;
}