cf1066F Yet Another 2D Walking (贪心+dijkstra)
易证我们走的时候只会从某一层的某端点走向另一端点、然后走向下一层的某端点..
所以建图然后dijkstra就行了
调了一年以后发现dijkstra写错了
#include<bits/stdc++.h>
#define pa pair<ll,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=4e5+;
const ll inf=1e18; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int b,ne;ll l;
}eg[maxn*];
struct Node{
ll x,y,l;
}pos[maxn];
int N,egh[maxn],ect;
ll dd[maxn];
bool flag[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q; inline bool cmp(Node a,Node b){return a.l<b.l;}
inline void adeg(int a,int b,ll l){
eg[++ect].b=b;eg[ect].ne=egh[a];eg[ect].l=l;egh[a]=ect;
}
inline ll dis(int a,int b){return abs(pos[a].x-pos[b].x)+abs(pos[a].y-pos[b].y);} void dijkstra(){
CLR(dd,-);
dd[+N]=;q.push(make_pair(,+N));
while(!q.empty()){
int p=q.top().second;q.pop();
if(flag[p]) continue;
flag[p]=;
for(int i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;
if(dd[b]==-||dd[b]>dd[p]+eg[i].l){
dd[b]=dd[p]+eg[i].l;
q.push(make_pair(dd[b],b));
}
}
}
} int main(){
//freopen(".in","r",stdin);
int i,j,k;
N=rd();
for(i=;i<=N;i++)
pos[i].x=rd(),pos[i].y=rd(),pos[i].l=max(pos[i].x,pos[i].y);
pos[N+].x=,pos[N+].y=,pos[N+].l=;
N++;
sort(pos+,pos+N+,cmp);
int lst1=-,lst2=-;
int la=-,lb=-;
for(i=N,j=N,k=N;i;i){
int aa=-,bb=-;
for(;pos[j].l==pos[i].l&&j;j--){
if(aa==-||pos[j].x<pos[aa].x||(pos[j].x==pos[aa].x&&pos[j].y>pos[aa].y)) aa=j;
if(bb==-||pos[j].y<pos[bb].y||(pos[j].y==pos[bb].y&&pos[j].x>pos[bb].x)) bb=j;
}
if(lst1==-) lst1=aa;
if(lst2==-) lst2=bb;
if(la!=-) adeg(aa+N,la,dis(la,aa)),adeg(bb+N,la,dis(la,bb));
if(lb!=-) adeg(aa+N,lb,dis(lb,aa)),adeg(bb+N,lb,dis(lb,bb));
adeg(aa,bb+N,dis(aa,bb));adeg(bb,aa+N,dis(aa,bb));
la=aa,lb=bb;
}
dijkstra();
printf("%I64d\n",min(dd[lst1+N],dd[lst2+N]));
return ;
}
cf1066F Yet Another 2D Walking (贪心+dijkstra)的更多相关文章
- CF1066F Yet another 2D Walking
DP 由图可以知道优先级相同的点都在一个"7"字形中 所以在走当前的优先级的点时最好从右下的点走到左上的点,或从从左上的点走到右下的点 那记dp[i][0]表示在走完第i个优先级时 ...
- CodeForces Round #515 DIv.3 F. Yet another 2D Walking
http://codeforces.com/contest/1066/problem/F Maksim walks on a Cartesian plane. Initially, he stands ...
- Dijkstra最短路径算法[贪心]
Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...
- NYOJ 203 三国志(Dijkstra+贪心)
三国志 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 <三国志>是一款非常经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.如今他把游戏简化一下 ...
- [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)
1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- Codeforces Round #303 (Div. 2) E. Paths and Trees Dijkstra堆优化+贪心(!!!)
E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 1154D - Walking Robot - [贪心]
题目链接:https://codeforces.com/contest/1154/problem/D 题解: 贪心思路,没有太阳的时候,优先用可充电电池走,万不得已才用普通电池走.有太阳的时候,如果可 ...
- 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法
Dijkstra算法实际上是一个贪婪算法(Greedy algorithm).因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点.Dijkstra算法的过程如下图所示. 初始化 给定图中 ...
随机推荐
- POJ 2299
上课讲了下数据结构,因为暂时没找到分块的板子题,所以做一下这道题加深一下对树状数组的理解. 题意就是求逆序对,从逆序对的定义就可以看出,方法有两种:归并 or 树状数组. 感觉树状数组更高级一点,写起 ...
- Word2010去除灰色中括号标记
在使用的Word复制内容时,有时会出现这种情况: 去除灰色中括号 出现这种情况,是因为无意中插入了书签.解决方案如下: 或者直接使用ctrl+shift+F5,选择要删除的标签
- 使用DOS工具修复数据库
当SQL Server 实例出现异常,无法远程链接时,数据库管理员需要登陆到SQL Server实例机器上,通过命令行工具,修复异常. 一,使用net命令行启动数据库 通过net start 命令启动 ...
- selenium常用命令
openopen(url)- 在浏览器中打开URL,可以接受相对和绝对路径两种形式type type(inputLocator, value)- 模拟人手的输入过程,往指定的input中输入值- 也适 ...
- NetBeans 插件开发简介
希望 NetBeans 为您提供更多功能吗? 您希望倾心投入到 NetBeans 的开发中,并希望它能激发您开发另一个应用程序的热情.您希望聆听音乐.浏览网页.查看邮件.存储喜欢的 URL,以及维护日 ...
- [Direct2D开发] 绘制网格
转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...
- iOSPush自动隐藏tabbar
只需要在UITabBarController添加控制器的时候调用YZNav初始化,就可以实现tabbar的自动隐藏了. 直接上github地址:https://github.com/YouZhiZhe ...
- twig用法
1. GyAdminBundle::base.html.twig 必须添加Bundle名才可引用模板
- HTML5遇到的问题
一.Uncaught SyntaxError: Unexpected identifier 解决办法: Uncaught SyntaxError: Unexpected identifier这个问题, ...
- Game over 作业
终于有一篇不拼代码拼码字的作业了,哈哈哈..... 从寒假到这次结束,经历的博客及编码作业的过程 前面七次作业做个分类: 通往博客园和C++的第一步. 知识点:让我们对C++做一个预习,在学C++前有 ...