CF2034G2 Simurgh's Watch (Hard Version)

题目描述

传说中的神鸟 Simurgh 负责守护一片辽阔的土地,她为此招募了 $n$ 名机敏的战士。每位战士都需要在特定的时间段 $[l_i, r_i]$ 内保持警戒,其中 $l_i$ 代表起始时间(包含),$r_i$ 代表结束时间(包含),两者均为正整数。 Simurgh 信任的顾问 Zal 担心,如果多个战士同时在岗且都穿着相同的颜色,那么他们之间可能会难以区分,从而导致混乱。为解决这一问题,在每个整数时刻 $t$,如果有多个战士在岗,必须确保至少有一种颜色仅被其中一个战士穿着。 任务是找出所需的最少颜色数量,并为每个战士的时间段 $[l_i, r_i]$ 分配一种颜色 $c_i$,使得对于包含在至少一个时间段内的每个整数时间点 $t$,总有一种颜色只被一个时间段在$t$时刻使用。

输入格式

第一行输入一个整数 $t$($1 \leq t \leq 10^4$),表示测试用例的数量。 对于每个测试用例: - 第一行包含一个整数 $n$($1 \leq n \leq 2 \cdot 10^5$),表示 Simurgh 招募的战士数量。 - 随后的 $n$ 行中,每行包含两个整数 $l_i$ 和 $r_i$($1 \leq l_i \leq r_i \leq 10^9$),表示第 $i$ 位战士的警戒时间段。 所有测试用例中的 $n$ 之和不超过 $2 \cdot 10^5$。

输出格式

对于每个测试用例: - 输出所需的最少颜色数量 $k$。 - 接下来输出一行,包括 $n$ 个整数 $c_i$($1 \leq c_i \leq k$),每个 $c_i$ 表示分配给第 $i$ 位战士的颜色。

说明/提示

我们可以将每位战士的警戒时间段看作 X 轴上的一个区间。 以下示例展示了如何为各个测试用例的区间着色(区域只有在某时间点,仅某种颜色出现时该区域才被染色): - 测试用例 1: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2034G2/a8ca04e863ed852cb4b11c3982c1d5442199b24b.png) - 测试用例 2: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2034G2/36f2a5d9878f69668f835178da7df8642bec8342.png) - 测试用例 3: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2034G2/75559577acf19732a5a59981d3806145e52c5ed5.png) **本翻译由 AI 自动生成**