题意为安排时间相交的两门课安排在同一天考试,先排序,然后遍历每一次后面的和前面的有相交的区间,把后一个的区间改为相交的那一部分。
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstdio>
using namespace std;
struct node
{
int st;
int et;
int t;
int idt;
}c[101000];
bool cmp(node a,node b)
{
if(a.st==b.st)
{
return a.et<b.et;
}
return a.st<b.st;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&c[i].st,&c[i].et);
c[i].idt=i;
}
sort(c+1,c+n+1,cmp);
c[1].t=1;
int time=1;
for(int i=2;i<=n;i++)
{
if(c[i].st<c[i-1].et)
{
c[i].t=time;
c[i].st = max(c[i].st, c[i-1].st);
c[i].et = min(c[i].et, c[i-1].et);
}
else
{
time++;
c[i].t=time;
}
}
printf("%d\n",time);
for(int j=1;j<=n;j++)
{
if(c[j+1].t==c[j].t)
{
printf("%d ",c[j].idt);
}
else
{
printf("%d\n",c[j].idt);
}
}
}
return 0;
}