二分+前缀和+思维,CF 1902D - Robot Queries

news2024/11/25 20:52:04

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

1902D - Robot Queries


二、解题报告

1、思路分析

不管怎么反转:

起点终点不变

[0, l - 1] 的路径上的点不变

[r, n] 的路径上的点不变

记 op[l - 1]后,坐标为(lx, ly),op[r] 后 为(rx, ry),询问(x, y),[l, r] 的 x偏移量为dx,[l, r]的y偏移量为dy

反转前,我们从(lx, ly) 走 (dx, dy) 走到 (rx, ry)

反转后,相当于从(lx, ly) 走 (dx1, dy1) 到(x, y),再从(x, y) 走 (dx2, dy2) 到 (rx, ry)

其中 dx1 + dx2 = dx, dy1 + dy2 = dy

显然dx1 = rx - x, dy1 = ry - y

即到达(x, y)时候的操作下标为k,那么(dx1, dy1)就是[l, k] 操作的偏移量

我们只需判断 (x, y) 是否在[0, l - 1] || [r, n]出现,以及[lx + dx1, ly + dy1] 是否在[l, r - 1]出现

2、复杂度

时间复杂度: O(NlogN + q logq)空间复杂度:O(N)

3、代码详解

 ​
#include <bits/stdc++.h>

using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;

constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr int P = 998'244'353;

void solve() {
	int n, q;
	std::cin >> n >> q;

	std::string s;
	std::cin >> s;

	std::map<std::pair<int, int>, std::vector<int>> mp;

	std::vector<std::pair<int, int>> pos(n + 1);

	mp[std::pair(0, 0)].push_back(0);

	for (int i = 0; i < n; ++ i) {
		pos[i + 1].first = pos[i].first + (s[i] == 'R') - (s[i] == 'L');
		pos[i + 1].second = pos[i].second + (s[i] == 'U') - (s[i] == 'D');
		mp[pos[i + 1]].push_back(i + 1);
	}


	auto check = [&](const std::pair<int, int> &p, int l, int r) -> bool {
		if (!mp.contains(p)) return false;
		auto it = std::lower_bound(mp[p].begin(), mp[p].end(), l);
		return it != mp[p].end() && *it <= r;
	};

	for (int i = 0, x, y, l, r; i < q; ++ i) {
		std::cin >> x >> y >> l >> r;

		int nx = pos[l - 1].first + pos[r].first - x, ny = pos[l - 1].second + pos[r].second - y;

		bool f = check(std::pair(x, y), 0, l - 1) ||
			check(std::pair(nx, ny), l, r - 1) ||
			check(std::pair(x, y), r, n);

		f ? std::cout << "YES\n" : std::cout << "NO\n";
	}
}

auto FIO = []{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	return 0;
}();

int main () {
	#ifdef DEBUG
		freopen("in.txt", "r", stdin);
		freopen("out.txt", "w", stdout);
	#endif
	
	int T = 1;
	// std::cin >> T;
	while (T --)
		solve();

	return 0;
}

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

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

相关文章

【新品实测】C1001毫米波人体检测传感器来了!跌倒检测、睡眠监测更准确!

我们最近推出了一款全新的60G毫米波产品&#xff1a;C1001毫米波人体检测传感器。在这篇文章中&#xff0c;我们将深入测评这款产品的性能&#xff0c;并详细解析C1001毫米波人体检测传感器的功能和特性。 产品链接&#xff1a;C1001 60GHz毫米波人体检测传感器 原文链接&…

QML ScrollView 实现自动滚动到底部

先看效果,每当有新的日志,会自动添加到Text中,主要实现了ScrollView自动滑动到底部,显示最新的日志 目录 1.思路2.position分析 1.思路 在官网中scrollview并没有关于scrollview位置的设置 但是我们可以控制右边滑动条scrollbar的位置 注意position并不是一个高度数据,你可以…

Adobe Dreamweaver(DW)网页代码编辑器win/mac软件安装下载

一、Adobe DW软件概览 1.1 DW软件简介 Adobe Dreamweaver&#xff08;简称DW&#xff09;是一款功能强大的网页代码编辑器&#xff0c;由Adobe公司开发并维护。其全称为“Adobe Dreamweaver”&#xff0c;中文译为“梦想编织者”。DW集网页制作和管理网站于一身&#xff0c;支…

Allegro PCB位号重排反标原理图步骤

第一步&#xff1a;也是最重要的一步&#xff0c;备份整个工程文件夹。 防止操作过程中误操作导致工程文件出问题&#xff0c;万一出问题&#xff0c;没有备份&#xff0c;调整代价比较大 第二步&#xff1a;确认当前PCB和原理图的网表统一。 稳妥做法&#xff1a; 2a:原理图…

Linux入门——07 动静态库软硬连接

1.动静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的代码。一…

如何在VMware ESXI中创建Linux虚拟机并实现异地SSH远程访问

目录 ⛳️推荐 前言 1. 在VMware ESXI中创建Ubuntu虚拟机 2. Ubuntu开启SSH远程服务 3. 安装Cpolar工具 4. 使用SSH客户端远程访问Ubuntu 5. 固定TCP公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

抛苹果卖银行 巴菲特到底怕什么?

文&#xff5c;琥珀食酒社 作者 | 积溪 停不下来、根本就停不下来 94岁的巴菲特还在疯狂卖股票 他到底是看到什么我们没看到的真相 对咱们普通人到底有没有参照价值&#xff1f; 我先说结论 你可以不相信有钱人的人品 但一定要知道有钱人的钱去哪儿了 尤其这个人还是巴…

机房环境监控系统

随着信息技术的飞速发展&#xff0c;数据中心作为信息处理的核心设施&#xff0c;其重要性日益凸显。数据中心内部通常包含大量的服务器、存储设备以及网络设备等关键基础设施&#xff0c;这些设备的稳定运行直接影响到业务的连续性和数据的安全性。因此&#xff0c;建立一个高…

插入排序(直接插入排序和希尔排序)

先写单趟&#xff0c;再写整体。 一、直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经安排好的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新…

2024年【起重信号司索工(建筑特殊工种)】考试题及起重信号司索工(建筑特殊工种)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重信号司索工(建筑特殊工种)考试题是安全生产模拟考试一点通总题库中生成的一套起重信号司索工(建筑特殊工种)免费试题&#xff0c;安全生产模拟考试一点通上起重信号司索工(建筑特殊工种)作业手机同步练习。2024年…

自定义注解,实现字段加密解密

根据业务需求,要求多部分字段,进行加解密,想到实现方式,就是通过自定义的注解AOP来实现 首先新建一个注解,注意ElementType.FIELD类型,说明这个注解只能作用在字段上 Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) public interface NeedEncrypt { }在新建…

合宙Air700ECQ硬件设计手册——应用接口2

Air700ECQ是一款高度集成的LTE Cat1无线通信模组&#xff0c;基于移芯EC716E平台设计&#xff0c;有着极小的封装和极高的性价比。 它支持移动双模FDD-LTE/TDD-LTE 4G远距离无线传输技术&#xff0c;能够广泛应用于共享设备、定位器、DTU数传等多种场景。 此外&#xff0c;Air7…

基于方面的情感分析研究综述——论文阅读笔记

前言 学习NLP领域知识时&#xff0c;先从情感分析入手。 在网上看到一篇方面级的情感分析综述性文章&#xff0c;觉得挺好的就找到其原来的论文进行阅读。 原文&#xff1a;《A Survey on Aspect-Based Sentiment Analysis: Tasks, Methods, and Challenges》 原文地址&#xf…

Python中定义和使用类的私有属性和方法

类的私有属性和方法指的是只能在类的内部使用&#xff0c;而不能在类外使用的属性和方法。 1 单下划线方式 在定义类的属性和方法时&#xff0c;在名字前面加一个下划线&#xff0c;此时表示该属性或方法只能在类的内部使用&#xff0c;而不能在类的外部使用&#xff0c;代码…

2024生成式AI商业落地白皮书_火山引擎

更多详细内容请下载资源 2024生成式AI商业落地白皮书-火山引擎

字符串函数———C语言

1. 求字符串的长度 strlen 原型&#xff1a;size_t strlen(const char *str); 原理&#xff1a;字符串以\0作为结束标志&#xff0c;strlen函数返回的是在字符串中\0前面出现的字符个数&#xff08;不包括\0&#xff09;参数指向的字符串必须要以\0结束 #include <stdio…

配置策略路由实战 附带基础网络知识

背景 作为一个软件开发人员&#xff0c;不可能做到只负责业务开发工作&#xff0c;一旦功能上线或者系统切换就会遇到非常多考验开发人员个人能力的场景&#xff0c;网络调整就是非常重要的一个方面&#xff0c;如果你在系统上线的过程中无法处理一些简单的网络问题或者听不懂…

SpringBoot的内置缓存以及整合第三方缓存

一、什么是缓存 企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。 应用程序直接与数据库打交道&#xff0c;访问效率低 为了改善上述现象&#xff0c;开发者通常会在应用程序与数据库之间建…

【避雷】Fomepay跑路大揭秘!还我q来!

震惊&#xff01;Fomepay公司一夜之间消失无踪&#xff0c;用户资金不翼而飞&#xff01; 首先&#xff0c;讲一下我自己的经历&#xff0c;想使用fomepay开卡订阅gpt&#xff0c;充值两百多后&#xff0c;想提现客服直接跑路&#xff01;充多少吞多少&#xff01;骗子公司&am…

Linux pstree 命令详解

pstree 命令是一个在 Unix-like 系统中用于以树状图的形式显示当前运行的进程的命令。这种展示方式比简单的列表&#xff08;ps查看&#xff09;更加直观&#xff0c;有助于用户快速理解进程的层次结构和父子关系。 在诊断系统问题时&#xff0c;pstree 可以帮助确定哪些进程是…