题目描述

小 A 决定开始一场奇妙的徒步旅行,旅行地图可以看成是一个平面直角坐标系,小 A 从家O(0,0)O(0, 0)O(0,0)出发,每一步移动只能由他此时所在的位置(x,y)(x,y)(x,y)走到以下四个坐标之一:(x−1,y),(x,y−1),(x+1,y),(x,y+1)(x-1,y),(x,y-1),(x+1,y),(x,y+1)(x−1,y),(x,y−1),(x+1,y),(x,y+1)。

现在有nnn个旅游景点,第iii个旅游景点位置为(xi ,yi)。

由于世界如此之大,整个旅行地图被分成了多个不同的气候区,某个景点(xi ,yi)的气候区Ci=max(xi ,yi) 。小 A 想要更好的了解这个世界使得他这次徒步旅行更有意义,所以他想要去气候区 旅行当且仅当访问完气候区为 的所有旅游景点。当他访问完所有的景点时,他会回到家里。

输入格式

小 A 想让你帮他设计出一条旅游路线使得他移动的步数最少,因为徒步旅行还是比较累的……
输入格式
第一行输入一个整数n,表示旅游景点数量。
接下来n行,每行一个整数对(xi ,yi)代表第 个景区的位置。

输出格式

仅一行,表示小 A 完成旅行所需移动的最少步数。

样例

样例输入1

8
2 2
1 4
2 3
3 1
3 4
1 1
4 3
1 2

样例输出1

20

样例输入2

5
2 1
1 0
2 0
3 2
0 3

样例输出2

12

分析

首先看到这一道题,一定会想到使用搜索(他把方向都告诉你了)。
但我看了一眼数据——10910^9109。(我TM直接放弃 )
所以说搜索是肯定会超时的。但终究有点分。
对于每一个气候,可以发现它的起点和终点最有的取法一定是两个端点。
在最优解中,只需要走到两个端点,就可以遍历玩这一气候区的所有点。


然后……
先把输入的x,yx,yx,y按气候区的从小到大排序,即:

bool cmp(Node x, Node y) {return x.Map_C != y.Map_C ? x.Map_C < y.Map_C : (x.Map_X != y.Map_X ? x.Map_X < y.Map_X : x.Map_Y < y.Map_Y);
}

我们用两个dp来存储,一个存贮最左端点,一个存储最右端点。
所以
dp1[i]=min(dp1[i−1]+calc(l[i−1],r[i]),dp2[i−1]+calc(r[i−1],r[i]))+calc(r[i],l[i]);dp1[i] = min(dp1[i - 1] + calc(l[i - 1], r[i]), dp2[i - 1] + calc(r[i - 1], r[i])) + calc(r[i], l[i]);dp1[i]=min(dp1[i−1]+calc(l[i−1],r[i]),dp2[i−1]+calc(r[i−1],r[i]))+calc(r[i],l[i]);
dp2[i]=min(dp1[i−1]+calc(l[i−1],l[i]),dp2[i−1]+calc(r[i−1],l[i]))+calc(l[i],r[i]);dp2[i] = min(dp1[i - 1] + calc(l[i - 1], l[i]), dp2[i - 1] + calc(r[i - 1], l[i])) + calc(l[i], r[i]);dp2[i]=min(dp1[i−1]+calc(l[i−1],l[i]),dp2[i−1]+calc(r[i−1],l[i]))+calc(l[i],r[i]);
l[i]l[i]l[i]用于记录最左端点的排序后顺序,r[i]r[i]r[i]用于记录最右端点的排序后顺序,calc函数是用来计算两点间距离的,不难想到:

long long calc(long long x, long long y) {return abs(a[x].Map_X - a[y].Map_X) + abs(a[x].Map_Y - a[y].Map_Y);
}

(注:记得将气候区离散化,否则会超时)

代码实现

综上所述,代码就出来了

#include <map>
#include <set>
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
const ll MAXN = 3e5 + 5;
struct Node {ll Map_X, Map_Y, Map_C;
};
set<ll> st;
map<ll, ll> mpl;
map<ll, ll> mpr;
map<ll, ll> id1;
map<ll, ll> id2;
map<ll, bool> mpX;
map<ll, bool> mpY;
Node a[MAXN];
ll dp1[MAXN], dp2[MAXN];
ll l[MAXN], r[MAXN];
ll n;
bool cmp(Node x, Node y) {return x.Map_C != y.Map_C ? x.Map_C < y.Map_C : (x.Map_X != y.Map_X ? x.Map_X < y.Map_X : x.Map_Y < y.Map_Y);
}
ll calc(ll x, ll y) {return abs(a[x].Map_X - a[y].Map_X) + abs(a[x].Map_Y - a[y].Map_Y);
}
void Read() {scanf("%lld", &n);mpX[0] = mpY[0] = 1;for(ll i = 1; i <= n; i++) {scanf("%lld %lld", &a[i].Map_X, &a[i].Map_Y);a[i].Map_C = max(a[i].Map_X, a[i].Map_Y);st.insert(a[i].Map_C);}for(set<ll>::iterator it = st.begin(); it != st.end(); it++) {mpl[*it] = 0x7fffffff;}sort(a + 1, a + 1 + n, cmp);for(ll i = 1; i <= n; i++) {if(min(a[i].Map_X, a[i].Map_Y) <= mpl[a[i].Map_C]) {mpl[a[i].Map_C] = min(mpl[a[i].Map_C], min(a[i].Map_X, a[i].Map_Y));id2[a[i].Map_C] = i;}if(min(a[i].Map_X, a[i].Map_Y) >= mpr[a[i].Map_C]) {mpr[a[i].Map_C] = max(mpr[a[i].Map_C], min(a[i].Map_X, a[i].Map_Y));id1[a[i].Map_C] = i;}}int p = 0;for(set<ll>::iterator it = st.begin(); it != st.end(); it++) {l[++p] = id2[*it];r[p] = id1[*it];}for(ll i = 1; i <= p; i++) {dp1[i] = min(dp1[i - 1] + calc(l[i - 1], r[i]), dp2[i - 1] + calc(r[i - 1], r[i])) + calc(r[i], l[i]);dp2[i] = min(dp1[i - 1] + calc(l[i - 1], l[i]), dp2[i - 1] + calc(r[i - 1], l[i])) + calc(l[i], r[i]);}printf("%lld", min(dp1[p] + calc(l[p], 0), dp2[p] + calc(r[p], 0)));
}
int main() {Read();return 0;
}

可能有亿点点麻烦,真就亿点点呗。(小声)

[某人的题解]徒步旅行(travel)相关推荐

  1. [多校联考-初级]徒步旅行

    题目 [内存限制:$512 MiB$] [时间限制:$2000 ms$] [标准输入输出] [题目类型:传统] [评测方式:文本比较] [题目描述] 小$A$决定开始一场奇妙的徒步旅行,旅行地图可以看 ...

  2. 徒步旅行中的注意事项

    比起其他形式的旅游,徒步旅游受自然界的影响最大,消耗的体力也最多,特别需要注意几个问题: 1.最好是结伴而行,至少是三个人以上,途中可以互相帮助,互相照顾.但又最好不要人太多,否则互相干扰,行动不便. ...

  3. 五一出游-徒步旅行主旋律

    十大徒步线路第十名:徒步漓江--领略"甲天下"的风光 "桂林山水甲天下",此语尽人皆知.据说桂林是外国游客们到中国旅游最向往的四个地方之一.不过大部分的人去桂 ...

  4. 上海-苏州 100公里徒步旅行心情分享(一)

    进入9月份的上海,天气格外的清凉,记得那天是周一的上午,万总给了我一条留言,说这周末(也就是中秋节)想从上海徒步到苏州,呵,当时也不知道出于什么原因或者脑子搭错了哪根筋,特兴奋,也不知道哪里来的勇气就 ...

  5. 开车旅行 travel

    题目描述 JY J Y JY是一个爱旅游的探险家,也是一名强迫症患者.现在 JY J Y JY想要在 C C C国进行一次长途旅行,C国拥有n个城市(编号为0,1,2...,n−1" rol ...

  6. 旅行(travel)

    时间限制: 5 Sec 内存限制: 512 MB 题目描述 小R开车去C国旅行.C国所有n座城市构成一棵树,且树上的每条边的长度L_i满足1≤L_i≤2.小R打算白天开车,晚上到达一个城市后在该城市休 ...

  7. Jzoj3625 旅行(travel)

    非常好的树剖模板题了,直接C颗线段树上去就好了,动态开点一次写对~ #pragma GCC opitmize("O3") #pragma G++ opitmize("O3 ...

  8. 谷歌maps菜单语言设置_如何在Google Maps中测量跑步,骑自行车和徒步旅行的距离...

    谷歌maps菜单语言设置 Getting directions in Google Maps lets you easily see how far away the destination is. ...

  9. 多校联考 CSP-J 2019 第三次模拟赛 题解

    Notice :1.T4算法7的f(t)f(t)f(t)函数写错了-已更正. 2. 之后(可能)会发git链接. 3. 欢迎评论. 4. T4是有O(n2log⁡n)O(n^2 \log n)O(n2 ...

最新文章

  1. 如何基于DDD构建微服务架构
  2. java使用原始套接字技术进行数据包截获_Linux零拷贝技术,看完这篇文章就懂了...
  3. 【源资讯 第24期】有人总想搞大新闻:“Windows 11”爆猛料;微信放出“小程序码”...
  4. kafka comsumer
  5. 【机器学习】全面归纳距离和相似度方法(7种)
  6. Fast R-CNN论文详解
  7. Docker运行操作系统环境(BusyBoxAlpineDebian/UbuntuCentOS/Fedora)
  8. sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet
  9. 《零基础》MySQL 排序(十八)
  10. Qt4_你可以使用加农炮了
  11. ResNet网络结构搭建
  12. 清除壁垒 大数据推动城市规划质突破
  13. tp5 获取当前的url方法
  14. 大脑简史(1)-历史上的大事件
  15. 【Linux】ssh连接远程服务器
  16. Suspicious size this will make the view invisible, probably intended for layout_width
  17. IDEA终于支持云端了,可同步所有配置和插件,一招搞定,重装不愁
  18. 单片机编程软件很简单(23),keil单片机编程软件调试stm32
  19. vant-ui 使用
  20. Mac 下载各种工作软件网站

热门文章

  1. Android 仿朋友圈,文字图片视频多条目,自动播放暂停
  2. 新三级医院信息化建设解决方案
  3. Java深入学习系列之值传递Or引用传递?
  4. 根据Email地址跳转到邮箱登录界面
  5. xen html挂件桌面不显示,桌面图标不显示
  6. COCOS学习笔记--TexturePacker使用详解
  7. Android系统OTA升级
  8. PAT B1032. 挖掘机技术哪家强 (20)
  9. 手机话费充值接口,实现话费充值功能接入
  10. 一个老牛的视频sdk