UOJ Logo Universal Online Judge

UOJ

#406. 【IOI2018】排座位

附件下载 统计

你要在一个长方形大厅里举办国际编程比赛,该大厅共有 HW 个座位(HW 列)。行的编号是从 0H1,列的编号是从 0W1。位于 rc 列的座位用 (r,c) 表示。一共邀请了 HW 位参赛者,编号是从 0HW1。你制定好了一个座位表,第 i0iHW1)个参赛者被安排到座位 (Ri,Ci)。座位表中参赛者和座位是一一对应的。

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

  • 0r1r2H1
  • 0c1c2W1
  • S 正好是所有满足 r1rr2c1cc2 的座位 (r,c) 的集合。

如果一个长方形座位集合包含 k1kHW)个座位,并且被分配到这个集合的参赛者的编号恰好是从 0k1,那么该集合是美妙的。一个座位表的美妙度定义为这个表中美妙的长方形座位集合的个数。

在准备好座位表后,你会收到一些交换两个参赛者座位的请求。具体来说,有 Q 个这样的请求,按时间顺序编号为 0Q1。第 j0jQ1)个请求希望交换参赛者 AjBj 的座位。你立即接受每个请求并更新座位表。每次更新后,你的目标是计算当前座位表的美妙度。

实现细节

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

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
  • 该函数应返回交换座位后座位表的美妙度

例子

H=2W=3R=[0,1,1,0,0,1]C=[0,0,1,1,2,2],和 Q=2

评测程序先调用 give_initial_chart(2, 3, [0, 1, 1, 0, 0, 1], [0, 0, 1, 1, 2, 2])

最初,座位表如下:

034125

假设评测程序调用 swap_seats(0, 5)。在这个编号为 0 的请求完成后,座位表变成:

534120

对应参赛者集合 {0},{0,1,2}{0,1,2,3,4,5} 的三个座位集合都是长方形和美妙的。所以,该座位表的美妙度为 3swap_seats 应该返回 3

假设评测程序再次调用 swap_seats(0, 5)。在这个编号为 1 的请求完成后,座位表回到初始状态。对应参赛者集合 {0},{0,1},{0,1,2,3}{0,1,2,3,4,5} 的四个座位集合都是长方形和美妙的。所以,该表的美妙度为 4swap_seats 应该返回 4

在样例数据下载中的文件ex_seats1.inex_seats1.out对应于上述例子。此外,样例数据包中还有一些其他的输入输出例子。

限制条件

  • 1H
  • 1W
  • HW1 000 000
  • 0RiH10iHW1
  • 0CiW10iHW1
  • (Ri,Ci)(Rj,Cj)0i<jHW1
  • 1Q50 000
  • 对于 swap_seats 的所有调用,0aHW1
  • 对于 swap_seats 的所有调用,0bHW1
  • 对于 swap_seats 的所有调用,ab

子任务

  1. (5分)HW100Q5 000
  2. (6分)HW10 000Q5 000
  3. (20分)H1 000W1 000Q5 000
  4. (6分) 对于 swap_seats 的所有调用,Q5 000|ab|10 000
  5. (33分)H=1
  6. (30分)无附加限制条件

评测程序示例

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

  • 1 行:H W Q
  • 2+i 行(0iHW1) : Ri Ci
  • 2+HW+j 行(0jQ1):Aj Bj

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

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

  • 1+j 行(0jQ1):swap_seats 对于请求 j 的返回值

约定及限制

对于所支持的各种编程语言,下面列出了对应的数据类型。对于数据类型的细节等,参见实现示例。

语言 int int64 int[] 数组a的长度 string
C++intlong longstd::vector<int>a.size()std::string

时间限制:3s

空间限制:268MB

下载

样例数据下载