loj#P2864. 「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 的座位。你立即接受每个请求并更新座位表。每次更新后,你的目标是计算当前座位表的美妙度。

交互过程

在程序开始,你应该引入 seats.h 头文件。

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

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 的返回值