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

本蒟蒻写的第一篇题解,点个赞再走呗~

思路

当我们看到标签的时候,会看到这样两个字:“模拟”。

所以本蒟蒻的第一个方法就是模拟。

非常令人激动的是,最后四个点 TLE 了……

所以,我们要使出我们的终极大法:打表 找规律。

找规律

我们可以把它分为四个象限,求出顶角的 disdis 值,然后再加减坐标距离值 dis(X,Y)dis(X,Y) 与顶点坐标的 disdis 值。

1. 第一象限

第一象限中,我们设 m=max(x,y)m=\rm{max}(|x|,|y|) ,此时 dis(m,m)=(2m)2dis(m,m)=(2m)^2

接着需要判断 x<mx<my<my<m

(1)当 y=my=m 时,坐标 (x,y)(x,y)(m,m)(m,m) 左侧,此时需要减去 mxm-x ,即 dis(x,y)=dis(m,m)(mx)dis(x,y)=dis(m,m)-(m-x)

(2)当 x=mx=m 时,坐标 (x,y)(x,y)(m,m)(m,m) 下边,此时需要加上 mym-y ,即 dis(x,y)=dis(m,m)+(my)dis(x,y)=dis(m,m)+(m-y)

2. 第二象限

第二象限中,坐标 (m,m)(m,m)dis(m,m)=2m(2m1)dis(m,m)=2m(2m-1) 。但是此时 x(,0]x\in(-\infty,0] ,故 xx 需要取绝对值。

比较方法同上(或查看 AC 代码)。

3. 第四象限

第四象限中,坐标 (m,m)(m,m)dis(m,m)=2m(2m+1)dis(m,m)=2m(2m+1) 。但是此时 y(,0]y\in(-\infty,0] ,故 yy 需要取绝对值。

比较方法同上(或查看 AC 代码)。

4. 第三象限

第三象限的坐标的 disdis 值的规律本蒟蒻实在没想出来,所以用了第二和第四象限的坐标 disdis 值计算,此时需要判断 y>x|y|>|x|

(1)当 y>x|y|>|x| 时,dis(m,m)=2m(2m+1)dis(m,m)=2m(2m+1) , 此时 $dis(x,y)=dis(x,y)+(m+|x|) $。

(2)当 y<x|y|<|x| 时,dis(m,m)=2m(2m1)dis(m,m)=2m(2m-1) , 此时 dis(x,y)=dis(x,y)(m+y)dis(x,y)=dis(x,y)-(m+|y|)

AC 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
\\(可能不是最优解)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
ll x,y,m,cnt,dis;
cin >> x >> y;
m = max(abs(x),abs(y));
if(x>0 and y>=0){
dis = (m*2)*(m*2);
if(x<m) dis -= (m-x);
else if(y<m) dis += (m-y);
}
else if(x<=0 and y>0){
dis = (m*2)*(m*2-1);
if(abs(x)<m) dis += (m-abs(x));
else if(y<m) dis -= (m-y);
}
else if(x>=0 and y<0){
dis = (m*2)*(m*2+1);
if(x<m) dis += (m-x);
else if(abs(y)<m) dis -= (m-abs(y));
}
else if(x<0 and y<=0){
if(abs(y)>=abs(x)){
dis = (m*2)*(m*2+1);
dis += (m+abs(x));
}
else{
dis = (m*2)*(m*2-1);
dis -= (m+abs(y));
}
}
cout << dis;
return 0;
}

AC 记录


题解 P8668 [蓝桥杯 2018 省 B] 螺旋折线
https://sunnyli.咕咕咕.eu.org/solution-P8668/
作者
SunnyLi
发布于
2023年4月22日
许可协议