Codeforces Round #355 (Div. 2) D. Vanya and Treasure 分治暴力
D. Vanya and Treasure
题目连接:
http://www.codeforces.com/contest/677/problem/D
Description
Vanya is in the palace that can be represented as a grid n × m. Each room contains a single chest, an the room located in the i-th row and j-th columns contains the chest of type aij. Each chest of type x ≤ p - 1 contains a key that can open any chest of type x + 1, and all chests of type 1 are not locked. There is exactly one chest of type p and it contains a treasure.
Vanya starts in cell (1, 1) (top left corner). What is the minimum total distance Vanya has to walk in order to get the treasure? Consider the distance between cell (r1, c1) (the cell in the row r1 and column c1) and (r2, c2) is equal to |r1 - r2| + |c1 - c2|.
Input
The first line of the input contains three integers n, m and p (1 ≤ n, m ≤ 300, 1 ≤ p ≤ n·m) — the number of rows and columns in the table representing the palace and the number of different types of the chests, respectively.
Each of the following n lines contains m integers aij (1 ≤ aij ≤ p) — the types of the chests in corresponding rooms. It's guaranteed that for each x from 1 to p there is at least one chest of this type (that is, there exists a pair of r and c, such that arc = x). Also, it's guaranteed that there is exactly one chest of type p.
The only line of the input contains a single word s (1 ≤ |s| ≤ 100 000), consisting of digits, lowercase and uppercase English letters, characters '-' and '_'.
Output
Print one integer — the minimum possible total distance Vanya has to walk in order to get the treasure from the chest of type p.
Sample Input
3 4 3
2 1 1 1
1 1 1 1
2 1 1 3
Sample Output
5
Hint
题意
给你一个n*m的方格,你需要把权值为p的那个门打开,前提是你必须打开过权值为p-1的门……
然后问你打开权值为p的门,你最少走的距离是多少,一开始你在(1,1)
题解:
n*mlog的就扫描线莽一波
n^3的话,就分治一下就好了,如果当前权值的数量小于sqrt(nm)的话,我就暴力更新,否则我就在全图进行一次bfs
这样均摊下来,复杂度是nmsqrt(n)sqrt(m)的
所以直接暴力吧
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 305;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int a[maxn][maxn],dp[maxn][maxn],n,m,p;
int dis[maxn][maxn],inq[maxn][maxn];
vector<pair<int,int> >V[maxn*maxn];
int main()
{
memset(dp,127,sizeof(dp));
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==1)dp[i][j]=i-1+j-1;
V[a[i][j]].push_back(make_pair(i,j));
}
}
int level = sqrt(n*m);
int idx=1;
queue<pair<int,int> >Q;
for(int i=1;i<p;i++)
{
int sz = V[i].size();
if(sz<=level){
for(auto v:V[i+1])
for(auto u:V[i])
dp[v.first][v.second]=min(dp[v.first][v.second],dp[u.first][u.second]+abs(v.first-u.first)+abs(v.second-u.second));
}
else{
idx++;
for(auto v:V[i])
Q.push(v);
memset(dis,127,sizeof(dis));
for(auto v:V[i])
dis[v.first][v.second]=dp[v.first][v.second];
while(!Q.empty())
{
pair<int,int>now=Q.front();
Q.pop();
inq[now.first][now.second]=0;
for(int k=0;k<4;k++)
{
pair<int,int>next=now;
next.first+=dx[k];
next.second+=dy[k];
if(next.first<1||next.first>n)continue;
if(next.second<1||next.second>m)continue;
if(dis[next.first][next.second]>dis[now.first][now.second]+1)
{
dis[next.first][next.second]=dis[now.first][now.second]+1;
if(inq[next.first][next.second]<idx){
inq[next.first][next.second]=idx;
Q.push(next);
}
}
}
}
for(auto v:V[i+1])
dp[v.first][v.second]=dis[v.first][v.second];
}
}
cout<<dp[V[p][0].first][V[p][0].second]<<endl;
}
Codeforces Round #355 (Div. 2) D. Vanya and Treasure 分治暴力的更多相关文章
- Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块
题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...
- Codeforces Round #355 (Div. 2) D. Vanya and Treasure
题目大意: 给你一个n × m 的图,有p种宝箱, 每个点上有一个种类为a[ i ][ j ]的宝箱,a[ i ][ j ] 的宝箱里有 a[ i ][ j ] + 1的钥匙,第一种宝箱是没有锁的, ...
- Codeforces Round #355 (Div. 2) C. Vanya and Label 水题
C. Vanya and Label 题目连接: http://www.codeforces.com/contest/677/problem/C Description While walking d ...
- Codeforces Round #355 (Div. 2) B. Vanya and Food Processor 水题
B. Vanya and Food Processor 题目连接: http://www.codeforces.com/contest/677/problem/B Description Vanya ...
- Codeforces Round #355 (Div. 2) A. Vanya and Fence 水题
A. Vanya and Fence 题目连接: http://www.codeforces.com/contest/677/problem/A Description Vanya and his f ...
- Codeforces Round #355 (Div. 2)-B. Vanya and Food Processor,纯考思路~~
B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes input s ...
- Codeforces Round #355 (Div. 2)C - Vanya and Label
啊啊啊啊啊啊啊,真的是智障了... 这种题目,没有必要纠结来源.只要知道它的结果的导致直接原因?反正这句话就我听的懂吧... ">>"/"&" ...
- Codeforces Round #355 (Div. 2) B. Vanya and Food Processor
菜菜菜!!!这么撒比的模拟题,听厂长在一边比比比了半天,自己想一想,然后纯模拟一下,中间过程检测一下,妥妥的就可以过. 题意:有N个东西要去搞碎,每个东西有一个高度,然后有一台机器支持里面可以达到的最 ...
- 水题 Codeforces Round #308 (Div. 2) A. Vanya and Table
题目传送门 /* 水题:读懂题目就能做 */ #include <cstdio> #include <iostream> #include <algorithm> ...
随机推荐
- linux===sar命令性能监控
sar介绍: sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态.它的特点是可以连 ...
- aarch64_l2
libfreehand-devel-0.1.1-5.fc26.aarch64.rpm 2017-05-23 07:16 26K fedora Mirroring Project libfreehand ...
- 比特币pow算法介绍
Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...
- unity3d 材质概述 ---- shader
学习笔记: 材质概述: 物体呈现在我们前面除了形体外,还包括“固有颜色”和“质地”(质感与光学性质).固有颜色让物体的表面看起来是什么颜色,而质感决定了该物质是使用什么材质的.在三维建模软 ...
- MongoDB官方文档结构
本文展示MongoDB 3.6.4.0的官方Server文档的结构图——一眼可见完整的知识脉络图.不过,MongoDB除了Server的文档外,还有DRIVERS.CLOUD.TOOLS.DUIDES ...
- Java线程:新特征-有返回值的线程《转》
原始文章 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. ...
- Linux学习笔记:crontab定时任务
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据 ...
- poj 2369(置换群)
Permutations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3041 Accepted: 1641 Desc ...
- Linux系统的优势
熟悉电脑的人都知道,Linux 相比较于 Windows 有着众多的优势,所以现在越来越多的电脑用户开始使用 Linux 进行办公.学习.总体来讲,Linux 的优势主要有以下几个方面. 一.开源.免 ...
- InterSystems Ensemble学习笔记(一) Ensemble介绍及安装
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...