博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1066F-Yet another 2D Walking【贪心】
阅读量:2022 次
发布时间:2019-04-28

本文共 964 字,大约阅读时间需要 3 分钟。

正题

题目链接:


题目大意

平面上有 n n n个点,每个点在 m a x ( x , y ) max(x,y) max(x,y)层,走第 k k k层的点之前一定要先走前面层的点,求走完所有点的最短路。


解题思路

对于每一层来说,我们可以将其看成一条直线,那么我们走某一层一定是先走到最边上的点再走到另一边最边上的点,因为如果这两个点也是必走的,如果没有走到这个点不行,如果走到了这个点,那么这边的所有点一定已经走到过。

所以排序来做即可


c o d e code code

#include
#include
#include
#include
#define ll long long using namespace std;const ll N=2e6+10;ll n,cnt,x[N],y[N],z[N],b[N*2];ll mx[N],mn[N],f[N],dmin,dmax;vector
q[N];ll get_dis(ll x1,ll y1,ll x2,ll y2){
return abs(x1-x2)+abs(y1-y2);} int main(){
scanf("%lld",&n); for(ll i=1;i<=n;i++){
scanf("%lld%lld",&x[i],&y[i]); b[++cnt]=x[i];b[++cnt]=y[i]; } sort(b+1,b+1+cnt); cnt=unique(b+1,b+1+cnt)-b-1; for(ll i=1;i<=n;i++){
x[i]=lower_bound(b+1,b+1+cnt,x[i])-b; y[i]=lower_bound(b+1,b+1+cnt,y[i])-b; ll k=max(x[i],y[i]); if(x[i]==k) q[k].push_back(z[i]=b[k]-b[y[i]]); else q[k].push_back(z[i]=b[x[i]]-b[k]); if(z[i]>z[mx[k]]||!mx[k])mx[k]=i; if(z[i]

转载地址:http://bcwaf.baihongyu.com/

你可能感兴趣的文章
bash 作业控制
查看>>
物理内存的管理
查看>>
高效能人士的七个习惯——由内而外全面造就自己
查看>>
为什么精英都是清单控(笔记)——工作清单
查看>>
怦然心动的人生整理魔法(笔记)——物品类别整理
查看>>
让人生发生戏剧性变化的整理魔法(笔记)
查看>>
怦然心动的人生整理魔法(笔记)
查看>>
什么是“怦然心动的感觉”
查看>>
按物品类别整理的心动收纳法(笔记)
查看>>
沟通的艺术(笔记)——前言
查看>>
有效沟通的基本原则(笔记)
查看>>
演讲、演讲人、听众
查看>>
有备演讲和即兴演讲的目的(笔记)
查看>>
番茄工作图解——序(笔记)
查看>>
为何要用番茄工作法(笔记)
查看>>
番茄工作法--背景(笔记)
查看>>
番茄工作法——方法(笔记)
查看>>
番茄工作法——中断(笔记)
查看>>
番茄工作法——预估(笔记)
查看>>
番茄工作法——应变(笔记)
查看>>