问你有交集(覆盖)的区间一共有多少组并输出。
还是区间问题。
写码能力太弱,思路很容易想到了但是写却写了半天。中间还超时了好几次,所以最后我连int数组都没开。
最后还是AC了,不容易。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
struct Course
{
int l,r,id;
bool operator <(const Course a) const
{
if(l!=a.l)
return l<a.l;
if(r!=a.r)
return r<a.r;
return id<a.id;
}
};
Course p[100005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0; i<n; ++i)
{
scanf("%d%d",&p[i].l,&p[i].r);
p[i].id=i+1;
}
sort(p,p+n);
int MN=p[0].r;
int ansn=1;
for(int i=1; i<n; ++i)
{
if(p[i].l>=MN )
{
ansn++;
MN=p[i].r;
}
if(p[i].r<MN)
MN=p[i].r;
}
printf("%d\n",ansn);
int nn=0;
for(int i=0; i<n; )
{
int mn=p[i].r;
int pos=i;
bool fir=false;
while(p[pos].l<mn&&pos<n)
{
if(!fir) {printf("%d",p[pos].id);fir=true;}
else printf(" %d",p[pos].id);
if(p[pos].r<mn) mn=p[pos].r;
pos++;
}
printf("\n");
if(pos>=n) break;
else i=pos;
}
printf("\n");
}
return 0;
}