【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线

题目描述

如图所示的螺旋折线经过平面上所有整点恰好一次。

对于整点 ( X , Y ) (X, Y) (X,Y),我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。

例如 dis ( 0 , 1 ) = 3 \text{dis}(0, 1)=3 dis(0,1)=3 dis ( − 2 , − 1 ) = 9 \text{dis}(-2, -1)=9 dis(2,1)=9

给出整点坐标 ( X , Y ) (X, Y) (X,Y),你能计算出 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 吗?

输入格式

X X X Y Y Y

输出格式

输出 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y)

样例 #1

样例输入 #1

0 1

样例输出 #1

3

提示

对于 40 % 40\% 40%的数据, − 1000 ≤ X , Y ≤ 1000 -1000\le X,Y\le 1000 1000X,Y1000

对于 70 % 70\% 70% 的数据, − 1 0 5 ≤ X , Y ≤ 1 0 5 -10^5\le X,Y \le 10^5 105X,Y105

对于 100 % 100\% 100% 的数据, − 1 0 9 ≤ X , Y ≤ 1 0 9 -10^9\le X,Y \le 10^9 109X,Y109


思路

暴力模拟会超时,不妨想想其他办法。

函数d(int t)计算从原点到点(-t, t)的螺旋折线距离,使用等差数列求和公式2t * (2t + 1) * 2 / 2

函数dis(int x, int y)是主要的计算函数,根据输入的坐标点(x, y),计算出螺旋折线距离。

观察到有三条分界线: y = x y = x y=x y = − x y=-x y=x y = x + 1 y=x+1 y=x+1 将图形分为四个部分。可以对每个区域分类讨论,通过从原点到点(-t, t)的螺旋折线距离,换算出从原点到任意点(x, y)的螺旋折线距离。

  • 当点位于左侧区域,并且满足条件 x ≥ 0 x \geq 0 x0 − x ≤ y -x \leq y xy y < x y < x y<x时,此时的螺旋折线距离可以通过公式 d ( t ) + 3 ∗ t − y d(t) + 3 * t - y d(t)+3ty计算,其中 t = x t = x t=x

  • 当点位于上侧区域,并且满足条件 y > 0 y > 0 y>0 − y < x -y < x y<x x ≤ y x \leq y xy时,此时的螺旋折线距离可以通过公式 d ( t ) + t + x d(t) + t + x d(t)+t+x计算,其中 t = y t = y t=y

  • 当点位于右侧区域,并且满足条件 x < 0 x < 0 x<0 x + 1 < y x + 1 < y x+1<y y ≤ − x y \leq -x yx时,此时的螺旋折线距离可以通过公式 d ( t ) − t + y d(t) - t + y d(t)t+y计算,其中 t = − x t = -x t=x

  • 当点位于下侧区域,此时的螺旋折线距离可以通过公式 d ( t ) − 3 ∗ t − x + 1 d(t) - 3 * t - x + 1 d(t)3tx+1计算,其中 t = − y + 1 t = -y + 1 t=y+1

main函数中,使用cin从输入中读取坐标点(x, y),然后调用dis(int x, int y)计算螺旋折线距离,并使用cout输出结果。

注意

对于 100 % 100\% 100% 的数据, − 1 0 9 ≤ X , Y ≤ 1 0 9 -10^9\le X,Y \le 10^9 109X,Y109。dis 可能会超出 int 的范围。需要开 long long,否则无法通过部分测试点。


AC代码

#include <algorithm>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;// 从原点到(-t, t)
ll d(int t) {// 2t * (2t + 1) * 2 / 2return (1ll * 2 * t * (2 * t - 1));
}ll dis(int x, int y) {if (x >= 0 && -x <= y && y < x) {// 右int t = x;// d + 2t + (t - y)return (1ll * d(t) + 3 * t - y);} else if (y > 0 && -y < x && x <= y) {// 上int t = y;// d + (t - x)return (1ll * d(t) + t + x);} else if (x < 0 && x + 1 < y && y <= -x) {// 左int t = -x;// d - (t - y)return (1ll * d(t) - t + y);} else {// 下int t = -y + 1;// d - (2t - 1) - (x + t)return (1ll * d(t) - 3 * t - x + 1);}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int x, y;cin >> x >> y;cout << dis(x, y) << "\n";return 0;
}

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

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

相关文章

新手做抖音小店,一定要避坑的五件事,非常重要!

大家好&#xff0c;我是电商糖果 现在做抖音小店已经进入一个稳定期&#xff0c;商家只要掌握正确的做店流程&#xff0c;然后把选品做好。 就可以将店铺做起来。 但这一切的前提是我们用对方法&#xff0c;这个很关键&#xff0c;因为这决定了你后面店铺的发展。 这篇文章…

蓝桥杯练习系统(算法训练)ALGO-981 过河马

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后&#xff0c;这匹马表示它不开心了……   于是&#xff0c…

C++、MFC中操作excel时,CRange中get_Rows()、get_Columns()及get_Count()函数的用法及区别是什么?

在C、MFC中操作Excel时&#xff0c;CRange类中的get_Rows()、get_Columns()和get_Count()函数都是用于获取指定范围的行数、列数或单元格数量的函数&#xff0c;但它们的具体用法和区别如下&#xff1a; get_Rows() 用法&#xff1a;LPDISPATCH get_Rows();功能&#xff1a;返回…

Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者

在往期文章中&#xff0c;我们讲了如何在Windows与Linux环境下安装RabbitMq服务&#xff0c;并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的&#xff0c;它起到一个什么作用&#xff0c;并且如何在常见的SpringBoot项目中集成mq并实现消息收发&#xff0c;本章…

Nginx实现高并发

注&#xff1a;文章是4年前在自己网站上写的&#xff0c;迁移过来了。现在看我之前写的这篇文章&#xff0c;描述得不是特别详细&#xff0c;但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的&#xff0c;可以在网上找找其他的文章。 ......................…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065

首先来看一下整体的流程: 可以看到了用到了上面的这些处理器,然后我们主要看看,这里之前 同步的时候,总是出现重复的数据,奇怪. 比如源表中只有166条数据,但是同步过去以后变成了11万条数据了. ${db.table.name:equals(table1):or(${db.table.name:equals(table2)})} 可以看…

【精选好刊】JCR2区SCI仅17天上线见刊,最后10篇版面!

录用案例 JCR2区地质环境类SCI&EI (进展顺) 【期刊简介】IF&#xff1a;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3/4区&#xff1b; 【检索情况】SCI&EI双检&#xff1b; 【征稿领域】地球观测、环境监测和管理相关或结合研究均可&#xff1b; 【案例分享】重…

[数据集][目标检测]遥感图像游泳池检测数据集VOC+YOLO格式288张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;288 标注数量(xml文件个数)&#xff1a;288 标注数量(txt文件个数)&#xff1a;288 标注类别…

前端面试练习24.3.8

防抖和节流 防抖&#xff08;Debouncing&#xff09;&#xff1a; 防抖是指在短时间内连续触发同一事件时&#xff0c;只执行最后一次触发的事件处理函数。 在实际应用中&#xff0c;常常用于处理用户输入的搜索框或者滚动事件。例如&#xff0c;当用户连续输入搜索关键词时&am…

macos系统中redis如何设置密码

在 macOS 上设置 Redis 密码的步骤与在其他操作系统上大致相同&#xff0c;关键是要找到并编辑 Redis 配置文件&#xff0c;然后重启 Redis 服务。以下是详细步骤&#xff1a; 找到 Redis 配置文件&#xff1a;如果你是通过 Homebrew 安装的 Redis&#xff0c;配置文件通常位于…

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

[N1CTF 2018]eating_cms 不会编程的崽

题倒是不难&#xff0c;但是实在是恶心到了。 上来就是登录框&#xff0c;页面源代码也没什么特别的。寻思抓包看一下&#xff0c;数据包直接返回了sql查询语句。到以为是sql注入的题目&#xff0c;直到我看到了单引号被转义。。。挺抽象&#xff0c;似乎sql语句过滤很严格。又…

Java基础知识点之思维导图

一、走进Java编程世界 二、变量常量和运算符 三、if选择结构 四、switch选择结构 五、while循环结构 六、for循环结构 七、数组 八、类与对象 九、深入循环结构 十、类的无参方法 十一、类的带参方法 十二、字符串

读已提交隔离级别下竟然有间隙锁

业务背景 广告主痛点的为进行一次全媒体联合投放&#xff0c;若投放10个媒体&#xff0c;需要制作和上传10个创意、50张不同尺寸和出血区要求的图片和视频素材、近100个元素&#xff0c;投放成本极高。这也是制约部分用户使用新产品投放的原因。 因此进行升级。以三个创意为例…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候&#xff0c;在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(四):消息队列MQ

文章目录 一、消息队列MQ二、RabbitMQ2.1 单机部署2.2 消息模型 三、SpringAMAP3.1 简单消息队列3.2 工作消息队列3.3 发布-订阅模型&#xff1a;FanoutExchange 广播交换机3.4 发布-订阅模型&#xff1a;DirectExchange 路由交换机3.5 发布-订阅模型&#xff1a;TopicExchange…

Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&#x…

推房子游戏c++

这段代码是一个推箱子游戏的实现。游戏中有一个地图&#xff0c;地图上有墙壁、人、箱子和目标位置。玩家通过键盘输入WASD或方向键来控制人物的移动&#xff0c;目标是将所有的箱子推到相应的目标位置上。 代码中的dt数组表示地图&#xff0c;每个位置上的字符表示对应的元素…

JAVA后端开发面试基础知识(六)——Redis

1. 内存淘汰策略 noeviction&#xff1a;当内存不足以容纳新写入数据时&#xff0c;新写入操作会报错allkeys-lru&#xff1a;当内存不足以容纳新写入数据时&#xff0c;在键空间中&#xff0c;移除近少使用的key。(这个是最常用的)allkeys-random&#xff1a;当内存不足以容纳…