首页 > 其他分享 >P7745 [COCI2011-2012#3] ROBOT

P7745 [COCI2011-2012#3] ROBOT

时间:2024-02-27 20:55:06浏览次数:31  
标签:哈曼 P7745 cin int bot ROBOT COCI2011 bound define

Description

在一个平面直角坐标系中,有一个点 bot,现有四个指令,分别可以让 bot 向上、下、左、右四个方向中的一个移动一格。同时还有 \(n\) 个固定点,求每次移动后这些点到 bot 的哈曼顿距离之和。

两个点 \((x1, y1)\) 和 \((x2, y2\) 的曼哈顿距离为 \(|x1 - x2| + |y1 - y2|\)。

Solution

40 pts

每次移动后暴力求出每个点的哈曼顿距离,相加输出即可。

code

#include <bits/stdc++.h>
#define N 100005
#define int long long
using namespace std;
namespace xycyx {
	int n, m;
	int hmd[N];
	int X[N], Y[N];
	char c;
	int botx = 0, boty = 0;
	int get_hmd(int X1, int Y1) {
		return abs(X1 - botx) + abs(Y1 - boty);
	}
	void solve() {
		ios::sync_with_stdio();
		cin.tie(0);
		cin >> n >> m;
		for (int i = 1; i <= n; i++) cin >> X[i] >> Y[i];
		for (int i = 1; i <= m; i++) {
			cin >> c;
			if (c == 'S') boty++;
			if (c == 'J') boty--;
			if (c == 'I') botx++;
			if (c == 'Z') botx--;
			int ans = 0;
			for (int i = 1; i <= n; i++)
				ans += get_hmd(X[i], Y[i]);
			cout << ans << '\n';
		}
	}
}
signed main() {
	xycyx::solve();
	return 0;
} //40pts

100 pts

鉴于数据范围,时间复杂度应为 \(O(m)\),故每次查询的时间复杂度都为 \(O(1)\)。

对于两条坐标轴,每次移动后分别二分求出有多少个点小于当前机器人的位置,多少点大于当前机器人的位置,求出当前移动对答案的贡献。直接更新答案并输出即可。

考虑一下每次移动造成的影响:

如果执行 S 操作,则意味着 bot 会从 移动到 \((0, 1)\) 的位置,此时明显的,对于 \(y \le y_{bot}\) 的 A、C、F 三点,哈曼顿距离分别加一;而对于 \(y > y_{bot}\) 的 B、D、E 三点而言,哈曼顿距离分别减一。即 \(y_i \le y_{bot}\) 的点在 S 操作时哈曼顿距离会增加,而 \(y_i > y_{bot}\) 的点在 S 操作时哈曼顿距离会减小。此时,答案的更新操作应为:减去移动前 \(y \le y_{bot}\) 的点的数量,加上当前 \(y \le y_{bot}\) 的点的数量。

对于剩余的三种操作同理。

可以使用 upper_boundlower_bound

code

注意先排序后再二分查找。

#include <bits/stdc++.h>
#define N 100000
#define M 300000
#define ll long long
using namespace std;
namespace cyxyc {
	int n, m;
	int X1, Y1, X2, Y2, X = 0, Y = 0;
	ll ans = 0;
	int x[N + 5], y[N + 5];
	char c[M + 5];
	int get_hmd(int x, int y) {
		return abs(x) + abs(y);
	}
	void solve() {
		ios::sync_with_stdio();
		cin.tie(0);
		cin >> n >> m;
		for (int i = 1; i <= n; i++) {
			cin >> x[i] >> y[i];
			ans += get_hmd(x[i], y[i]);
		}
		cin >> c + 1;
		sort(x + 1, x + n + 1), sort(y + 1, y + n + 1); //upper_bound 和 lower_bound 都是二分查找
		X1 = upper_bound(x + 1, x + n + 1, X) - (x + 1); //第一个大于当前位置的点的下标
		X2 = lower_bound(x + 1, x + n + 1, X) - (x + 1); //第一个大于等于当前位置的点的下标
		Y1 = upper_bound(y + 1, y + n + 1, Y) - (y + 1);
		Y2 = lower_bound(y + 1, y + n + 1, Y) - (y + 1);
		for (int i = 1; i <= m; i++) {
			if (c[i] == 'S') {
				ans += 2 * Y1 - n; //ans = ans - (n - Y1) + Y1
				Y++;
				Y1 = upper_bound(y + 1, y + n + 1, Y) - (y + 1);
				Y2 = lower_bound(y + 1, y + n + 1, Y) - (y + 1);
			}
			if (c[i] == 'J') {
				ans += n - 2 * Y2;
				Y--;
				Y1 = upper_bound(y + 1, y + n + 1, Y) - (y + 1);
				Y2 = lower_bound(y + 1, y + n + 1, Y) - (y + 1);
			}
			if (c[i] == 'I') {
				ans += 2 * X1 - n;
				X++;
				X1 = upper_bound(x + 1, x + n + 1, X) - (x + 1);
				X2 = lower_bound(x + 1, x + n + 1, X) - (x + 1);
			}
			if (c[i] == 'Z') {
				ans += n - 2 * X2;
				X--;
				X1 = upper_bound(x + 1, x + n + 1, X) - (x + 1);
				X2 = lower_bound(x + 1, x + n + 1, X) - (x + 1);
			}
			printf("%lld\n", ans);
		}
	}
}
int main() {
	cyxyc::solve();
	return 0;
}

标签:哈曼,P7745,cin,int,bot,ROBOT,COCI2011,bound,define
From: https://www.cnblogs.com/cloud-evecyx/p/18038313

相关文章

  • 机器人的运动控制是否可以引入生物学信息,生物学信息是否可以辅助机器人的智能控制算法
    相关内容:Roboticprostheticanklesimprove'natural'movement,stability看了上面的论文的介绍(内容没看到,不是openaccess论文),论文的主要思想就是利用人体腿部的神经信号来控制假肢脚踝的控制,从而使单侧下肢截肢后使用假肢的人获得更好的行动稳定性。这个研究的实验......
  • P7618 [COCI2011-2012#2] FUNKCIJA 题解
    看起来比较复杂,但实际上是一个树上dp的模型。因为每一重循环都最多有一个依赖,可以转化为树上的父子关系,于是就形成了一个森林。对于非叶子节点,设\(f_{u,i}\)表示第\(u\)循环变量的值是\(i\)时所有直接或间接依赖于它的循环变量(即以它为根的子树除开它的部分)循环次数,对非......
  • 模拟 - CF1196C Robot Breakout
    RobotBreakout(CF1196C)思路这道题因为平面极大,暴力枚举每个点肯定会超时。所以,我们不妨从机器人出发。我们可以枚举每个机器人可以执行的操作:位置从\((X_i,Y_i)\)变为\((X_i-1,Y_i)\),即向左走。位置从\((X_i,Y_i)\)变为\((X_i,Y_i+1)\),即向上走。位置从\((X_......
  • Agility Robotics和其他七家公司的类人机器人争夺工作岗位
    原创|文BFT机器人人形机器人何时会从研究项目过渡到商业产品?答案似乎是在2024年,届时一些资金充裕的公司将在商业试点项目中部署他们的机器人,以弄清楚人形机器人是否真的准备好投入工作。在2015年DARPA机器人挑战赛总决赛上亮相的机器人之一被称为ATRIAS,由俄勒冈州立大学动态机器......
  • Reinforcement Learning in Robotics: Enabling Autonomous Systems
    1.背景介绍人工智能(AI)和机器学习(ML)技术在过去的几年里取得了显著的进展,尤其是在深度学习方面。深度学习已经成功地应用于图像识别、自然语言处理、语音识别等领域,但在机器人控制和自主系统方面的应用仍然存在挑战。机器人控制和自主系统的主要挑战之一是如何让机器人能够在不同的环......
  • CF1045G AI robots题解
    题目链接:洛谷或者CF本题考虑转化为cdq分治模型对于cdq分治来说,只需要考虑左边对右边的影响,那我们要考虑该怎样设置第一维度的左右对象。很显而易见的是抛开\(q\)限制而言,我们着眼于,如何让双方互相看到的严格条件转化为只需要关注单体看见。考虑什么情况下只需要一方看到......
  • 浅析RobotFramework工具的使用 | 京东物流技术团队
    1简介最近几年越来越多的公司都开始进行自动化测试的设计和布局了,自动化,顾名思义就是把以人为驱动的测试行为转化为机器执行的一种过程,并经常用于回归测试中,市面上也存在很多开源的自动化测试的工具和理论知识,今天我要说的是RobotFramework这个工具;我也是在偶然的机会中接触到......
  • CF1902D Robot Queries 题解
    题意:有一个二维平面直角坐标系,给定一串向某个方向移动\(1\)个单位的操作。有\(q\)个询问,对于每个询问给定\(x,y,l,r\),问如果倒着做\(l\)到\(r\)这段区间中的操作,是否会经过\((x,y)\)。ds题。先预处理出\(sx_i,sy_i\)表示执行完操作\(i\)后的位置,如果在\([l,r]\)......
  • CF1253F Cheap Robot
    题意给定一个图,走过一条边的花费为权值,其中有\(k\)个充电点。你需要确定一个电量的上限,使得满足从\(a\)走到\(b\)。Sol先对于每个点求出她走到充电点最近的距离,用\(dij\)随便跑跑。考虑从\(a\tob\)一条边的贡献。设当前的电量上限为\(c\)。可得:\[c-dis_a\ge......
  • [CF1253F] Cheap Robot
    CheapRobot题面翻译给你一张\(N\)个点的带权无向连通图,其中结点\(1,2,…,k\)为充电中心。一个机器人在图中行走,假设机器人的电池容量为\(c\),则任何时刻,机器人的电量\(x\)都必须满足\(0\lex\lec\)。如果机器人沿着一条边权为\(w\)的边从结点\(i\)走到结点\(j\),......