#P50950. 「IOI2018」排座位

「IOI2018」排座位

题目描述

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

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

  • 0r1r2H10\le r_1\le r_2\le H-1
  • 0c1c2W10\le c_1\le c_2\le W-1
  • SS 正好是所有满足 r1rr2r_1\le r\le r_2c1cc2c_1\le c\le c_2 的座位 (r,c)(r,c) 的集合。

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

在准备好座位表后,你会收到一些交换两个参赛者座位的请求。具体来说,有 QQ 个这样的请求,按时间顺序编号为 00Q1Q-1。第 jj0jQ10\le j\le Q-1)个请求希望交换参赛者 AjA_jBjB_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
  • 该函数应返回交换座位后座位表的美妙度

数据范围与提示

  • 1H1\le H
  • 1W1\le W
  • HW1 000 000HW\le 1\ 000\ 000
  • 0RiH10\le R_i\le H-10iHW10\le i\le HW-1
  • 0CiW10\le C_i\le W-10iHW10\le i\le HW-1
  • (Ri,Ci)(Rj,Cj)(R_i,C_i)\ne(R_j,C_j)0i<jHW10\le i<j\le HW-1
  • 1Q50 0001\le Q\le 50\ 000
  • 对于 swap_seats 的所有调用,0aHW10\le a\le HW-1
  • 对于 swap_seats 的所有调用,0bHW10\le b\le HW-1
  • 对于 swap_seats 的所有调用,aba\ne b

子任务

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

评测程序示例

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

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

这里 AjA_jBjB_j 是调用 swap_seats 处理请求时的参数。

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

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