CF 821D Okabe and City
题意:给你一个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相关推荐
- CF821 D. Okabe and City 图 最短路
Link 题意:给出$n*m$大小的地图,已有$k$盏灯亮,人从左上角出发,右下角结束,期间必须走路灯点亮的地方,他可以在任意时刻消耗一枚硬币点亮一行或一列灯,他最多同时点亮一行或一列灯,要想点亮别的 ...
- 题解 CF821D 【Okabe and City】
其实,这道题不用long long也能AC. 题意是给你一个矩阵,有一些格子被点亮有一些没有,每一次只能在被点亮的格子上面走. 然后你每一次都可以选择点亮一行或一排(非永久),现在问你最少点多少次可以 ...
- [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),下一步可以拓展到 ...
- cf 821E Okabe and El Psy Kongroo(矩阵快速幂)
链接:http://codeforces.com/problemset/problem/821/E 分析:由于有边界而且不同段边界还不同,直接算是不行的..k是1e18,dp也不行..用一个16维的向 ...
- 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 ...
- codeforces round 420 div2 补题 CF 821 A-E
A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...
- Cassandra介绍和一些常用操作
Cassandra是一个高可靠的大规模分布式存储系统.高度可伸缩的.一致的.分布式的结构化key-value存储方案,集Google BigTable的数据模型与Amazon Dynamo的完全分布式 ...
- 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 ...
- CF K. City
https://codeforces.com/gym/103145/problem/K 一开始看到有环,就想着缩点了,但是对于每次询问,如果都建一个新图,必定会TLE 所以采用离线处理的方法,把询问按 ...
最新文章
- 快速上手关键词抽取的算法
- 推荐MIT的电路与电子学
- PR 简单使用(一)
- eyoucms问答 百度权重是什么
- Find a way——BFS
- 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
- 惊!MySQL官网巨变,下载被取消
- LINUX系统下监控DELL服务器硬盘状态
- leetcode @python 123. Best Time to Buy and Sell Stock III
- Android PopupWindow的简单说明
- 想批量转换音频?来试试这几个会议录音转文字软件
- Android 动态获取控件的宽高,并动态设置控件宽高
- tensor 增加维度_tensor维度变换
- 广西国家级自然保护区功能区划图(展示)
- 打造一个生命周期感知的MVP架构
- uniapp中上传图片
- Axure 8.1.0.3377最新激活码
- 汇编语言与高级语言的区别
- 【汇正财经】波段操作有哪些运用技巧?
- java基础学习 day34(StringBuilder,链式编程)