1 条题解

  • 0
    @ 2025-8-24 22:41:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ___w
    **

    搬运于2025-08-24 22:41:16,当前版本为作者最后更新于2023-06-07 16:02:34,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

    题意简述

    • 对于整点 (x,y)(x,y),定义它到原点的距离 dis(x,y)\text{dis}(x,y) 是从原点到 (x,y)(x,y) 的螺旋折线段的长度。
    • 给出整点坐标 (x,y)(x,y),求 dis(x,y)\text{dis}(x,y)

    题目分析

    做到这题看到这个大蚊香瞬间蚌埠住了,这题也就随随便便分类讨论罢了。

    图

    如图所示,我们可以将这个“大蚊香”分为上下左右四个部分。定义 n=max(x,y)n=\max(\left|x\right|,\left|y\right|)

    我们发现,像类似 dis(x,x)\text{dis}(x,-x)(其中 x0x\geqslant0)的值为左右部分的和和上下部分的和,为:

    d=(1+2++2n)+(1+2++2n)=2n(2n+1)d=(1+2+\cdots+2n)+(1+2+\cdots+2n)=2n(2n+1)

    那么我们就可以分别讨论点 (x,y)(x,y) 分别位于哪个部分,再对 dd 增减。

    y0y\geqslant0xy\left|x\right|\le y 时(即上部分),dis(x,y)=d3n+x\text{dis}(x,y)=d-3n+x

    y<0y<0y<xyy<x\le -y 时(即下部分),dis(x,y)=d+nx\text{dis}(x,y)=d+n-x

    x0x\geqslant0yx\left|y\right|\le x 时(即右部分),dis(x,y)=dny\text{dis}(x,y)=d-n-y

    x<0x<0x<yxx<y\le -x 时(即左部分),dis(x,y)=d5n+y\text{dis}(x,y)=d-5n+y

    这些结论可以自己在草稿纸上推一推,这里就不展开详细说明了。有了结论,代码也就简单了。

    代码

    记得开 long long

    #include <bits/stdc++.h>
    using namespace std;
    long long x, y, n, d;
    int main() {
    	cin >> x >> y;
    	n = max(abs(x), abs(y)), d = 2*n*(2*n+1);
    	if (y >= 0 && abs(x) <= y) cout << d-3*n+x;//上部分 
    	else if (y < 0 && y < x && x <= -y) cout << d+n-x;//下部分 
    	else if (x >= 0 && abs(y) <= x) cout << d-n-y;//右部分 
    	else if (x < 0 && x < y && y <= -x) cout << d-5*n+y;//左部分 
    	return 0;
    }
    
    • 1

    信息

    ID
    8126
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者