#P216. [Extra Contest #6] Unique Laser Gun

[Extra Contest #6] Unique Laser Gun

负责人

注意

本题有弱化版:

本题是交互题,请严格按照提交方式进行操作。

本题的空间限制为 8 MB。

题目背景

X 国最近在和 Y 国战斗。

X 国刚刚部署了一种激光武器,这种激光武器可以朝前后左右四个方向发射可以秒杀、无法防御的激光。

X 国的将领对这种武器十分重视,因为这种武器只能使用一次。

经过调查,他发现 Y 国的营地可以被激光破坏,并且可以被穿透。

现在 X 国的将领想要知道,是否有 Y 国的营地没有被破坏。

X 国的将领会向你进行多次询问,每次给出武器的坐标,询问是否有 Y 国的营地没有被破坏。

如果有,请告诉他没有被破坏的营地的最小编号。

题目描述

维护一个下标从 11 开始的序列 CC(初始为空,允许出现重复元素),其中的每一项均为二维整点。

你需要实现以下三个功能:

  1. CC 清空。
  2. CC 的末尾添加一个二维整点。
  3. CC 中查询满足以下要求的元素(二维整点)的下标:
    • 该点与给定的二维整点不重合。
    • 该点与给定的二维整点之间连成的线段不平行于坐标轴:既不平行于 xx 轴,也不平行于 yy 轴。
    • CC 中不存在满足上述两个要求且下标小于该点的点。

交互方式

本题为交互题。

请使用以下模板:

#include <bits/stdc++.h>
using namespace std;
// ...
void clear()
{
	// ...
}
void add(int x, int y)
{
	// ...
}
int query(int x, int y)
{
	// ...
	return 0;
}
  • 对于 clear() 函数:
    • 调用该函数时,程序应当将 CC 清空。
    • 该函数在单个测试点中最多调用 10510^5 次。
    • 保证不会在第一次调用该函数前调用其他函数。
  • 对于 add(x, y) 函数:
    • 调用该函数时,程序应当向 CC 的末尾添加整点 (x,y)(x, y)
    • 保证 1x,y1091 \le x, y \le 10^9
    • 该函数在单个测试点中最多调用 10710^7 次。
  • 对于 query(x, y) 函数:
    • 调用该函数时,程序应当返回 CC 中符合要求的那个元素的编号。
    • 特别地,如果 CC 中没有符合要求的元素,程序应当返回 00
    • 保证 1x,y1091 \le x, y \le 10^9
    • 该函数在单个测试点中最多调用 10710^7 次。
  • 你可以在 clear() 函数的注释前定义全局变量。

样例 1

调用函数 返回值 C=C =
clear(); // [][]
query(1, 1); 00 [][]
query(1, 2); 00 [][]
query(2, 1); 00 [][]
query(2, 2); 00 [][]
add(1, 1); // [(1,1)][(1, 1)]
query(1, 1); 00 [(1,1)][(1, 1)]
query(1, 2); 00 [(1,1)][(1, 1)]
query(2, 1); 00 [(1,1)][(1, 1)]
query(2, 2); 11 [(1,1)][(1, 1)]
add(2, 2); // [(1,1),(2,2)][(1, 1), (2, 2)]
query(1, 1); 22 [(1,1),(2,2)][(1, 1), (2, 2)]
query(1, 2); 00 [(1,1),(2,2)][(1, 1), (2, 2)]
query(2, 1); 00 [(1,1),(2,2)][(1, 1), (2, 2)]
query(2, 2); 11 [(1,1),(2,2)][(1, 1), (2, 2)]
clear(); // [][]
query(1, 1); 00 [][]
query(1, 2); 00 [][]
query(2, 1); 00 [][]
query(2, 2); 00 [][]
add(2, 2); // [(2,2)][(2, 2)]
query(1, 1); 11 [(2,2)][(2, 2)]
query(1, 2); 00 [(2,2)][(2, 2)]
query(2, 1); 00 [(2,2)][(2, 2)]
query(2, 2); 00 [(2,2)][(2, 2)]
add(1, 1); // [(2,2),(1,1)][(2, 2), (1, 1)]
query(1, 1); 11 [(2,2),(1,1)][(2, 2), (1, 1)]
query(1, 2); 00 [(2,2),(1,1)][(2, 2), (1, 1)]
query(2, 1); 00 [(2,2),(1,1)][(2, 2), (1, 1)]
query(2, 2); 22 [(2,2),(1,1)][(2, 2), (1, 1)]

样例 2

调用函数 返回值 C=C =
clear(); // [][]
query(1, 2); 00 [][]
query(2, 2); 00 [][]
query(3, 3); 00 [][]
add(1, 3); // [(1,3)][(1, 3)]
query(1, 2); 00 [(1,3)][(1, 3)]
query(2, 2); 11 [(1,3)][(1, 3)]
query(3, 3); 00 [(1,3)][(1, 3)]
add(3, 3); // [(1,3),(3,3)][(1, 3), (3, 3)]
query(1, 2); 22 [(1,3),(3,3)][(1, 3), (3, 3)]
query(2, 2); 11 [(1,3),(3,3)][(1, 3), (3, 3)]
query(3, 3); 00 [(1,3),(3,3)][(1, 3), (3, 3)]
clear(); // [][]
query(1, 2); 00 [][]
query(2, 2); 00 [][]
query(3, 3); 00 [][]
add(3, 3); // [(3,3)][(3, 3)]
query(1, 2); 11 [(3,3)][(3, 3)]
query(2, 2); 11 [(3,3)][(3, 3)]
query(3, 3); 00 [(3,3)][(3, 3)]
add(1, 3); // [(3,3),(1,3)][(3, 3), (1, 3)]
query(1, 2); 11 [(3,3),(1,3)][(3, 3), (1, 3)]
query(2, 2); 11 [(3,3),(1,3)][(3, 3), (1, 3)]
query(3, 3); 00 [(3,3),(1,3)][(3, 3), (1, 3)]