#P1838. 「IOI2018」排座位

「IOI2018」排座位

题目描述

你要在一个长方形大厅里举办国际编程比赛,该大厅共有 HWHW 个座位(HH 行 WW 列)。行的编号是从 00 到 H−1H-1,列的编号是从 00 到 W−1W-1。位于 rr 行 cc 列的座位用 (r,c)(r,c) 表示。一共邀请了 HWHW 位参赛者,编号是从 00 到 HW−1HW-1。你制定好了一个座位表,第 ii(0≤i≤HW−10\le i\le HW-1)个参赛者被安排到座位 (Ri,Ci)(R_i,C_i)。座位表中参赛者和座位是一一对应的。

大厅中一个座位集合 SS 被称为是长方形的,如果存在整数 r1,r2,c1r_1,r_2,c_1 和 c2c_2 满足下列条件:

  • 0≤r1≤r2≤H−10\le r_1\le r_2\le H-1。
  • 0≤c1≤c2≤W−10\le c_1\le c_2\le W-1。
  • SS 正好是所有满足 r1≤r≤r2r_1\le r\le r_2 和 c1≤c≤c2c_1\le c\le c_2 的座位 (r,c)(r,c) 的集合。

如果一个长方形座位集合包含 kk(1≤k≤HW1\le k\le HW)个座位,并且被分配到这个集合的参赛者的编号恰好是从 00 到 k−1k-1,那么该集合是美妙的。一个座位表的美妙度定义为这个表中美妙的长方形座位集合的个数。

在准备好座位表后,你会收到一些交换两个参赛者座位的请求。具体来说,有 QQ 个这样的请求,按时间顺序编号为 00 到 Q−1Q-1。第 jj(0≤j≤Q−10\le j\le Q-1)个请求希望交换参赛者 AjA_j 和 BjB_j 的座位。你立即接受每个请求并更新座位表。每次更新后,你的目标是计算当前座位表的美妙度。

输入格式

你应该实现下列过程和函数: ​

give_initial_chart(int H, int W, int[] R, int[] C)
  • H, W:行数和列数
  • R, C:两个长度为 HWHW 的数组,代表初始的座位表
  • 这个过程只被调用一次,而且是在 swap_seats 的任何调用之前。
int swap_seats(int a, int b)
  • 该函数用来处理一次交换座位的请求
  • a, b:需要交换座位的参赛者
  • 该函数被调用 QQ 次
  • 该函数应返回交换座位后座位表的美妙度

数据范围与提示

  • 1≤H1\le H
  • 1≤W1\le W
  • HW≤1 000 000HW\le 1\ 000\ 000
  • 0≤Ri≤H−10\le R_i\le H-1(0≤i≤HW−10\le i\le HW-1)
  • 0≤Ci≤W−10\le C_i\le W-1(0≤i≤HW−10\le i\le HW-1)
  • (Ri,Ci)≠(Rj,Cj)(R_i,C_i)\ne(R_j,C_j)(0≤i<j≤HW−10\le i<j\le HW-1)
  • 1≤Q≤50 0001\le Q\le 50\ 000
  • 对于 swap_seats 的所有调用,0≤a≤HW−10\le a\le HW-1
  • 对于 swap_seats 的所有调用,0≤b≤HW−10\le b\le HW-1
  • 对于 swap_seats 的所有调用,a≠ba\ne b

子任务

  1. (5分)HW≤100HW\le 100,Q≤5 000Q\le 5\ 000
  2. (6分)HW≤10 000HW\le 10\ 000,Q≤5 000Q\le 5\ 000
  3. (20分)H≤1 000H\le 1\ 000,W≤1 000W\le 1\ 000,Q≤5 000Q\le 5\ 000
  4. (6分) 对于 swap_seats 的所有调用,Q≤5 000Q\le 5\ 000,∣a−b∣≤10 000|a-b|\le 10\ 000
  5. (33分)H=1H=1
  6. (30分)无附加限制条件

评测程序示例

评测程序示例按照以下格式读入输入

  • 第 11 行:H W QH\ W\ Q
  • 第 2+i2+i 行(0≤i≤HW−10\le i\le HW-1) : Ri CiR_i\ C_i
  • 第 2+HW+j2+HW+j 行(0≤j≤Q−10\le j\le Q-1):Aj BjA_j\ B_j

这里 AjA_j 和 BjB_j 是调用 swap_seats 处理请求时的参数。

评测程序示例按照以下格式打印你的答案:

  • 第 1+j1+j 行(0≤j≤Q−10\le j\le Q-1):swap_seats 对于请求 jj 的返回值