P7473 重力球

news2025/4/9 9:19:26

P7473 重力球

Solution

考虑 Brute Force:对于每一次询问,通过 BFS 处理出最近的交汇点,输出答案。

很显然,会 TLE \colorbox{navy}{\color{white}{TLE}} TLE

故,考虑 优化

观察发现障碍物数量非常少,故设状态 ( x , y , d ) \mathrm{(x,y,d)} (x,y,d) 表示第 1 1 1 个小球被第 x x x 个障碍物卡住,第 2 2 2 个小球被第 y y y 个小球卡住,在障碍物的 d d d 方向(如图)。此时,发现总共的状态数量不多。

这样我们就可以用着 3 3 3 个数来确定出每个小球的位置。

之后,考虑每一次走一定是走到一个 障碍物四周 的点,所以可以提前预处理,记作 T o i , j , k \mathrm{To_{i,j,k}} Toi,j,k 表示 ( i , j ) (i,j) (i,j) k k k 方向会走到的点。

对于任意两个起点,需要向四周可到达的点连边:

假设当前是 x 1 , y 1 , d \mathrm{x_1,y_1,d} x1,y1,d,方向是 2 2 2,那么运动之后, d = d ⊕ 2 \mathrm{d=d\oplus 2} d=d2(即原来在上面,变成下面;原来在左边,变成右边…… 通过上图观察发现异或 2 2 2 可以解决);点会变为 T o x 1 , y 1 , 2 \mathrm{To_{x_1,y_1,2}} Tox1,y1,2

依此建边即可。


预处理操作结束之后,对于每一个询问:

  1. 直接 BFS 算出终点为哪个点最近(易 T L E \mathrm{TLE} TLE
  2. 正难则反,考虑对于所有可能终点中到这两个点的最短距离,这其实就是一个 多源BFS!注意:使用该方法需建反边!

建议采取第 2 2 2 种操作,当然这样并不需要每一次都进行 BFS,只需提前做 1 1 1 次即可。

由于,每一次询问的时候,不一定是在一个 障碍物四周,所以需要上、下、左、右四个方向,跑到障碍物四周,然后取最小值即可。


Code

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int SIZE = 255;

int N, M, Q;
vector<PII> Obstackle;
int Is[SIZE][SIZE], Id[SIZE][SIZE], cnt;
int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
int To[SIZE][SIZE][4], Dist[SIZE * 5][SIZE * 5][4];
struct P
{
	int x, y, d;
};
std::vector<P> G[SIZE * 5][SIZE * 5][4];
int Vis[SIZE * 5][SIZE * 5][4];

bool check(int x, int y)
{
	return x >= 1 && y >= 1 && x <= N && y <= N && !Is[x][y];
}

void Init()
{
	for (int i = 1; i <= N; i ++)
		for (int j = 1; j <= N; j ++)
			for (int k = 0; k < 4; k ++)
			{
				int x = i, y = j;
				while (!Is[x][y])
					x += dx[k], y += dy[k];
				To[i][j][k] = Id[x][y];
			}

	for (auto i : Obstackle)
		for (auto j : Obstackle)
			for (int sd = 0; sd < 4; sd ++)
				for (int k = 0; k < 4; k ++)
				{
					int x1 = i.first + dx[k], y1 = i.second + dy[k], x2 = j.first + dx[k], y2 = j.second + dy[k];
					if (check(x1, y1) && check(x2, y2))
					{
						int To1 = To[x1][y1][sd], To2 = To[x2][y2][sd];
						G[To1][To2][sd ^ 2].push_back({Id[i.first][i.second], Id[j.first][j.second], k});
					}
				}
}

void BFS()
{
	memset(Dist, 0x3f, sizeof Dist);
	queue<P> Q;
	for (auto c : Obstackle)
		for (int i = 0; i < 4; i ++)
		{
			int id = Id[c.first][c.second];
			int x = c.first + dx[i], y = c.second + dy[i];
			if (check(x, y))
				Dist[id][id][i] = 0, Q.push({id, id, i});
		}

	while (Q.size())
	{
		auto Tmp = Q.front();
		Q.pop();

		if (Vis[Tmp.x][Tmp.y][Tmp.d]) continue;
		Vis[Tmp.x][Tmp.y][Tmp.d] = 1;

		for (auto c : G[Tmp.x][Tmp.y][Tmp.d])
			if (Dist[c.x][c.y][c.d] > Dist[Tmp.x][Tmp.y][Tmp.d] + 1)
			{
				Q.push(c);
				Dist[c.x][c.y][c.d] = min(Dist[c.x][c.y][c.d], Dist[Tmp.x][Tmp.y][Tmp.d] + 1);
			}
	}
}

signed main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	cin >> N >> M >> Q;

	for (int i = 1; i <= M; i ++)
	{
		int x, y;
		cin >> x >> y;
		Id[x][y] = ++ cnt;
		Is[x][y] = 1;
		Obstackle.push_back({x, y});
	}

	for (int i = 0; i <= N + 1; i ++)
		for (int j = 0; j <= N + 1; j ++)
			if (!i || !j || i > N || j > N)
			{
				Id[i][j] = ++ cnt;
				Is[i][j] = 1;
				Obstackle.push_back({i, j});
			}

	Init();
	BFS();

	while (Q --)
	{
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;

		int Result = 2e9;
		for (int i = 0; i < 4; i ++)
			Result = min(Result, Dist[To[x1][y1][i]][To[x2][y2][i]][i ^ 2] + 1);
		
		if (x1 == x2 && y1 == y2) Result = 0;
		if (Result >= 1e9) Result = -1;
		cout << Result << endl;
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1141805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10 + VS2017 编译libjpeg(jpeg-9b)--更新

刚刚写了一篇“win10 VS2017 编译libjpeg&#xff08;jpeg-9b&#xff09;”&#xff0c; 然后就发现&#xff0c;还有一个更好的方法。因此&#xff0c;重新更新了一篇&#xff0c;作为对比与参考。 需要用到的文件&#xff1a; jpeg-9b.zip win32.mak 下载链接链接…

【Linux】Linux+Nginx部署项目

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.单体项目的部署 0.我们需要将要进行部…

『第八章』进击的雨燕:Combine 框架

在本篇博文中,您将学到如下内容: 1. Combine 为何物?1.1 观察者与响应式编程2. Combine 构成要素3. Combine 简单示例3.1 Just 发布者3.2 操作符的链式调用3.3 抛出错误的发布者3.4 消息流的保持和取消3.5 Combine 调试4. 更多 Combine 示例总结组织文章七尺身,庚庚烟缕碧菅新…

石油化工行业能源管理平台,让能源管理更简单,更高效

石油化工行业是高能耗、高污染的行业&#xff0c;能源消耗量巨大&#xff0c;且能源消耗量较低。为了提高能源利用效率&#xff0c;降低能源成本&#xff0c;石化企业需要加强对能源的管理和监控。因此石化企业需要建立一个高效的能源管理平台&#xff0c;来实现能源的集中管理…

Linux学习第24天:Linux 阻塞和非阻塞 IO 实验(一): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开始今天的笔记之前谈一下工作中遇见的一个问题。 本篇笔记主要学习Linux 阻塞和非阻塞 IO 实验&#xff0c;主要包括阻塞和非阻塞简介、等待队列、轮询、…

香港服务器如何做负载均衡?

​  在现代互联网时代&#xff0c;随着网站访问量的不断增加&#xff0c;服务器的负载也越来越重。为了提高网站的性能和可用性&#xff0c;负载均衡成为了一种常见的解决方案。 什么是负载均衡? 负载均衡是一种技术解决方案&#xff0c;用于在多个服务器之间分配负载&#…

每日汇评:黄金争取本周收于2000美元上方

在周五美国个人消费支出通胀之前&#xff0c;金价巩固了周四的双向价格走势&#xff1b; 在市场情绪改善之际&#xff0c;美元与美债收益率一同下跌&#xff1b; 黄金价格在日线图上确认了一个多头标志&#xff0c;相对强弱指数仍然指向更多的上涨&#xff1b; 周五早盘&#x…

点击空白处弹出框取消

新建click-outside.js文件 const clickoutsideContext clickoutsideContextexport default {/*param el 指令所绑定的元素param binding {Object} param vnode vue编译生成的虚拟节点*/bind(el, binding, vnode) {const documentHandler function(e) {if (!vnode.context ||…

Python通过Flask+pyecharts对房地产数据实现数据分析结果Web可视化(二)

一、背景 在Python通过pyecharts对爬虫房地产数据进行数据可视化分析&#xff08;一&#xff09;基础上添加Flask框架实现web可视化功能&#xff0c;把生成的所有图表生成一份完整的数据分析报告&#xff0c;这样就可以方便直接在网页上看到整体的数据分析可视化结果。 二、步骤…

协同设计有哪些优势和作用?

组织结构越来越复杂&#xff0c;团队中的每个人都有独特的技能、经验和专业知识。我们如何才能让团队更好地合作&#xff1f;在这种情况下&#xff0c;协同设计应运而生。在本文中&#xff0c;将讨论什么是协同设计&#xff0c;如何帮助我们创造高质量的产品。 什么是协同设计…

RFNet模型数据集采集处理流程

文章目录 cityscapes数据集内容如何标注数据得到标签图片 cityscapes数据集内容 训练模型的时候下载了cityscapes里的disparity、gtFine和leftImg8bit。 共5000张图片。2975张训练&#xff0c;500张验证&#xff0c;1525test。每个目录下都有train、test和val的子目录,这些子…

vue3动态引入图片(:src)

vite 官方默认的配置&#xff0c;如果资源文件在assets文件夹打包后会把图片名加上 hash值&#xff0c;但是直接通过 :src"imgSrc"方式引入并不会在打包的时候解析&#xff0c;导致开发环境可以正常引入&#xff0c;打包后却不能显示的问题 实际上我们不希望资源文…

虚拟机构建部署单体项目及前后端分离项目

目录 一.部署单体项目 1.远程数据库 1.1远程连接数据库 1.2 新建数据库运行sql文件 2.部署项目到服务器中 3.启动服务器运行 二.部署前后端分离项目 1.远程数据库和部署到服务器 2.利用node环境启动前端项目 3.解决主机无法解析服务器localhost问题 方法一 ​编辑 方…

什么?Postman也能测WebSocket接口了?

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址&#xff1a;https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由…

IEEE Standard for SystemVerilog Chapter9. Processes

9.1 General 本条款描述了以下内容&#xff1a; --结构化程序&#xff08;initial程序、always程序、final程序&#xff09; --块语句&#xff08;begin-end顺序块&#xff0c;fork-join并行块&#xff09; --时序控制&#xff08;delays, events, wa…

【计算机网络】应用层——HTTP协议

目录 1.HTTP协议简介2.认识URL3.urlencode和urldecode4.HTTP请求协议和响应协议HTTP请求协议HTTP响应协议 5.HTTP请求方法6.HTTP状态码7.HTTP常见的Hander8.Cookie和Session 1.HTTP协议简介 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议…

24 行为型模式-访问者模式

1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式。 2 访问者模式原理 3 访问者模式实现 我们以超市购物为例,假设超市中的三类商品: 水果,糖…

嵌入式软件工程师面试题——2025校招专题(四)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

python——requests模块

requests不是python的内置库&#xff0c;需要手动安装&#xff1a; pip install requests 一. 一个类型和六个属性 1.1 类型 requests访问url后返回的对象类型为requests.models.Response类型。 1.2 属性 下面是requests.models.Response类型对象的方法。 text&#xff1a;以…