#include <iostream>
#include <algorithm>
using namespace std;
struct Node
{
int start, end, index, group;
Node(int start = 0, int end = 0, int index = 0, int group = 0) : start(start), end(end), index(index), group(group) {}
};
Node nodes[50007];
int N, groupCount = 0;
bool compare(const Node &a, const Node &b)
{
if (a.start != b.start)
{
return a.start < b.start;
}
else
{
return a.end < b.end;
}
}
void input()
{
for (int i = 1; i <= N; i++)
{
scanf("%d%d", &nodes[i].start, &nodes[i].end);
nodes[i].index = i, nodes[i].group = 0;
}
sort(nodes + 1, nodes + N + 1, compare);
nodes[N + 1].start = 0x3f3f3f3f, nodes[N + 1].end = 0x3f3f3f3f;
}
void solve()
{
int currentRight = 0;
for (int i = 1; i <= N; i++)
{
if (nodes[i].group != 0)
{
continue;
}
groupCount++;
nodes[i].group = groupCount, currentRight = nodes[i].end;
int j = lower_bound(nodes + i + 1, nodes + 1 + N, currentRight + 1, compare) - nodes;
for (; j <= N; j++)
{
if (nodes[j].group != 0)
{
continue;
}
nodes[j].group = groupCount, currentRight = nodes[j].end;
j = lower_bound(nodes + j + 1, nodes + 1 + N, currentRight + 1, compare) - nodes;
j--;
}
}
}
bool compareIdx(const Node &a, const Node &b)
{
return a.index < b.index;
}
int main()
{
scanf("%d", &N);
input();
solve();
printf("%d\n", groupCount);
sort(nodes + 1, nodes + N + 1, compareIdx);
for (int i = 1; i <= N; i++)
{
printf("%d\n", nodes[i].group);
}
return 0;
}
POJ 3190 Stall Reservations 贪心 区间 二分
最新推荐文章于 2024-07-18 08:54:18 发布