题目描述
你要在一个长方形大厅里举办国际编程比赛,该大厅共有 HW 个座位(H 行 W 列)。行的编号是从 0 到 H−1,列的编号是从 0 到 W−1。位于 r 行 c 列的座位用 (r,c) 表示。一共邀请了 HW 位参赛者,编号是从 0 到 HW−1。你制定好了一个座位表,第 i(0≤i≤HW−1)个参赛者被安排到座位 (Ri,Ci)。座位表中参赛者和座位是一一对应的。
大厅中一个座位集合 S 被称为是长方形的,如果存在整数 r1,r2,c1 和 c2 满足下列条件:
- 0≤r1≤r2≤H−1。
- 0≤c1≤c2≤W−1。
- S 正好是所有满足 r1≤r≤r2 和 c1≤c≤c2 的座位 (r,c) 的集合。
如果一个长方形座位集合包含 k(1≤k≤HW)个座位,并且被分配到这个集合的参赛者的编号恰好是从 0 到 k−1,那么该集合是美妙的。一个座位表的美妙度定义为这个表中美妙的长方形座位集合的个数。
在准备好座位表后,你会收到一些交换两个参赛者座位的请求。具体来说,有 Q 个这样的请求,按时间顺序编号为 0 到 Q−1。第 j(0≤j≤Q−1)个请求希望交换参赛者 Aj 和 Bj 的座位。你立即接受每个请求并更新座位表。每次更新后,你的目标是计算当前座位表的美妙度。
交互过程
在程序开始,你应该引入 seats.h
头文件。
你应该实现下列过程和函数:
give_initial_chart(int H, int W, int[] R, int[] C)
H
, W
:行数和列数
R
, C
:两个长度为 HW 的数组,代表初始的座位表
- 这个过程只被调用一次,而且是在
swap_seats
的任何调用之前。
int swap_seats(int a, int b)
- 该函数用来处理一次交换座位的请求
a
, b
:需要交换座位的参赛者
- 该函数被调用 Q 次
- 该函数应返回交换座位后座位表的美妙度
数据范围与提示
- 1≤H
- 1≤W
- HW≤1 000 000
- 0≤Ri≤H−1(0≤i≤HW−1)
- 0≤Ci≤W−1(0≤i≤HW−1)
- (Ri,Ci)=(Rj,Cj)(0≤i<j≤HW−1)
- 1≤Q≤50 000
- 对于
swap_seats
的所有调用,0≤a≤HW−1
- 对于
swap_seats
的所有调用,0≤b≤HW−1
- 对于
swap_seats
的所有调用,a=b
子任务
- (5 分)HW≤100,Q≤5 000
- (6 分)HW≤10 000,Q≤5 000
- (20 分)H≤1 000,W≤1 000,Q≤5 000
- (6 分) 对于
swap_seats
的所有调用,Q≤5 000,∣a−b∣≤10 000
- (33 分)H=1
- (30 分)无附加限制条件
评测程序示例
评测程序示例按照以下格式读入输入
- 第 1 行:H W Q
- 第 2+i 行(0≤i≤HW−1) : Ri Ci
- 第 2+HW+j 行(0≤j≤Q−1):Aj Bj
这里 Aj 和 Bj 是调用 swap_seats
处理请求时的参数。
评测程序示例按照以下格式打印你的答案:
- 第 1+j 行(0≤j≤Q−1):
swap_seats
对于请求 j 的返回值