题意:给你一个n*m的格子,然后给你一些亮光点的坐标,你开始在(1,1)这个点,每次你可以上下左右走,但是如果格子是黑的,你首先必须要点亮它,你每次可以点亮一行或者一列的所有格子。但是这个技能有两个需要注意的地方:
1.如果你点亮了key行/列,那么当你离开当前key行/列时,你点亮的那些会灭掉。
2.发动技能的时候必须是在亮光的地方。
问你走到(n,m)的最少技能发动次数。如果到达不了,输出-1.
思路:
对给出的亮光点直接跑最短路,对于当前点u,和枚举的下一个点v,曼哈顿距离为1的点,边权自然为0.横坐标或纵坐标相差小于等于2的,边权为1,其余的点不能走。
需要注意的地方就是终点是你必须要点亮的,也就是说,如果终点是黑暗的点,你需要多加一个点(n+1,m+1)为什么要+1,这一点读者自己画画图就能够想明白了,主要是避免跟终点曼哈顿距离为1的亮光点存在。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>using namespace std;
typedef long long LL;
const int MAXN = 1e5+7;
const int inf = 1e6;
int n,m,k;
int s,e;
struct node
{int x,y;
}p[MAXN];bool flag;bool vis[MAXN];
int dis[MAXN];
void spfa()
{for(int i = 1; i <= k; ++i)dis[i] = inf;deque<int>q;q.push_back(s);dis[s] = 0;int cnt = 1,sum = 0;while(!q.empty()){int u = q.front();q.pop_front();if(dis[u]*cnt > sum){q.push_back(u);continue;}vis[u] = 0;cnt--,sum -= dis[u];for(int v = 1; v <= k; ++v){int x = p[v].x;int y = p[v].y;int dx = abs(p[u].x - x);int dy = abs(p[u].y - y);int w;if(dx + dy == 1)w = 0;else if(dx <= 2 || dy <= 2)w = 1;else continue;if(dis[u] + w < dis[v]){dis[v] = dis[u] + w;if(!vis[v]){vis[v] = 1;cnt++,sum += dis[v];if(q.empty() || dis[v] > dis[q.front()])q.push_back(v);else q.push_front(v);}}}}if(dis[e] == inf)puts("-1");else printf("%d\n",dis[e]);
}int main()
{scanf("%d%d%d",&n,&m,&k);e = -1;for(int i = 1; i <= k; ++i){scanf("%d%d",&p[i].x,&p[i].y);if(p[i].x == 1 && p[i].y == 1){s = i;}if(p[i].x == n && p[i].y == m){e = i;}}if(e == -1){p[++k].x = n+1;p[k].y = m+1;e = k;}spfa();return 0;
}

CF 821D Okabe and City相关推荐

  1. CF821 D. Okabe and City 图 最短路

    Link 题意:给出$n*m$大小的地图,已有$k$盏灯亮,人从左上角出发,右下角结束,期间必须走路灯点亮的地方,他可以在任意时刻消耗一枚硬币点亮一行或一列灯,他最多同时点亮一行或一列灯,要想点亮别的 ...

  2. 题解 CF821D 【Okabe and City】

    其实,这道题不用long long也能AC. 题意是给你一个矩阵,有一些格子被点亮有一些没有,每一次只能在被点亮的格子上面走. 然后你每一次都可以选择点亮一行或一排(非永久),现在问你最少点多少次可以 ...

  3. [CF 821E] Okabe and El Psy Kongroo

    题目 洛谷 题意 给定一个二维坐标系和一些线段,求从 (0,0)(0,0)(0,0) 走到 (k,0)(k,0)(k,0) 的方案总数.若当前坐标为 (x,y)(x,y)(x,y),下一步可以拓展到 ...

  4. cf 821E Okabe and El Psy Kongroo(矩阵快速幂)

    链接:http://codeforces.com/problemset/problem/821/E 分析:由于有边界而且不同段边界还不同,直接算是不行的..k是1e18,dp也不行..用一个16维的向 ...

  5. E.Okabe and El Psy Kongroo

    传送门 E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes in ...

  6. codeforces round 420 div2 补题 CF 821 A-E

    A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...

  7. Cassandra介绍和一些常用操作

    Cassandra是一个高可靠的大规模分布式存储系统.高度可伸缩的.一致的.分布式的结构化key-value存储方案,集Google BigTable的数据模型与Amazon Dynamo的完全分布式 ...

  8. CF#420 B. Okabe and Banana Trees 思维|暴力|几何

    Okabe needs bananas for one of his experiments for some strange reason. So he decides to go to the f ...

  9. CF K. City

    https://codeforces.com/gym/103145/problem/K 一开始看到有环,就想着缩点了,但是对于每次询问,如果都建一个新图,必定会TLE 所以采用离线处理的方法,把询问按 ...

最新文章

  1. 快速上手关键词抽取的算法
  2. 推荐MIT的电路与电子学
  3. PR 简单使用(一)
  4. eyoucms问答 百度权重是什么
  5. Find a way——BFS
  6. 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
  7. 惊!MySQL官网巨变,下载被取消
  8. LINUX系统下监控DELL服务器硬盘状态
  9. leetcode @python 123. Best Time to Buy and Sell Stock III
  10. Android PopupWindow的简单说明
  11. 想批量转换音频?来试试这几个会议录音转文字软件
  12. Android 动态获取控件的宽高,并动态设置控件宽高
  13. tensor 增加维度_tensor维度变换
  14. 广西国家级自然保护区功能区划图(展示)
  15. 打造一个生命周期感知的MVP架构
  16. uniapp中上传图片
  17. Axure 8.1.0.3377最新激活码
  18. 汇编语言与高级语言的区别
  19. 【汇正财经】波段操作有哪些运用技巧?
  20. java基础学习 day34(StringBuilder,链式编程)

热门文章

  1. getrand在c语言中的作用,c语言 rand 的用法
  2. 联想笔记本更换显示屏?
  3. 纯css实现带斜角的边框样式
  4. Mysql循环插入数据
  5. win7如何连接域控服务器,win7系统创建域控制器的操作方法
  6. 头歌实验平台Java实验三
  7. kaggle-地震预测-LANL Earthquake Prediction
  8. 画论02 顾恺之《魏晋胜流画赞》
  9. java毕设项目居家养老系统(附源码)
  10. 海马汽车经销商管理系统技术解析(二)维修收银