logo AlgoBeat OnlineJudge
登录 注册

Official Editorial

作者: 035966_L3  ·  发布于 2026-06-14 22:24:35  ·  最后修改于 2026-06-15 21:44:36
已通过
审核员:AlgoBeat 官方账号 · 2026-06-15 21:44:36

https://scg3.piaoztsdy.cn/p/216

考虑依次选取以下 个「关键营地」(需要指出的是,这 个「关键营地」不一定都存在):

  • 号「关键营地」为输入的第一个营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标相同, 坐标不同的营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标不同, 坐标相同的营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标不同, 坐标不同的营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标不同, 坐标不同,与 号「关键营地」 坐标相同, 坐标不同的营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标不同, 坐标不同,与 号「关键营地」 坐标不同, 坐标相同的营地。
  • 号「关键营地」为输入的第一个与 号「关键营地」 坐标不同, 坐标不同,与 号「关键营地」 坐标不同, 坐标不同的营地。

可以证明,如果某个询问有解,则这 个「关键营地」中必有一个是该询问的合法解,证明此处从略。

最终的时间复杂度为 ,空间复杂度为

#include <bits/stdc++.h>
#include "laser.h"
using namespace std;
int n = 0;
struct Point
{
	int x, y, i;
};
Point p[7];
void clear()
{
	cout << "";
	n = 0;
	memset(p, 0, sizeof p);
}
void add(int x, int y)
{
	n++;
	if (!p[0].i)
	{
		p[0] = (Point) {x, y, n};
		return;
	}
	if (x == p[0].x && y != p[0].y && !p[1].i) p[1] = (Point) {x, y, n};
	if (x != p[0].x && y == p[0].y && !p[2].i) p[2] = (Point) {x, y, n};
	if (x != p[0].x && y != p[0].y)
	{
		if (!p[3].i)
		{
			p[3] = (Point) {x, y, n};
			return;
		}
		if (x == p[3].x && y != p[3].y && !p[4].i) p[4] = (Point) {x, y, n};
		if (x != p[3].x && y == p[3].y && !p[5].i) p[5] = (Point) {x, y, n};
		if (x != p[3].x && y != p[3].y && !p[6].i) p[6] = (Point) {x, y, n};
	}
}
int query(int x, int y)
{
	int ans = n + 1;
	for (int i = 0; i <= 6; i++)
		if (x != p[i].x && y != p[i].y && p[i].i) ans = min(ans, p[i].i);
	if (ans == n + 1) ans = 0;
	return ans;
}
int main()
{
	cout << "";
	start();
}

暂无评论

登录 后即可评论。