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> ...
随机推荐
- 从Python到Web开发
基础部分: 1-编程基础及Python环境部署 2-Python基础语法-内存管理-运算符-程序控制 3-Python内置结构-列表 4-Python数据类型之元组-字符串 5-python的封装与结 ...
- 【Python项目】简单爬虫批量获取资源网站的下载链接
简单爬虫批量获取资源网站的下载链接 项目链接:https://github.com/RealIvyWong/GotDownloadURL 1 由来 自己在收集剧集资源的时候,这些网站的下载链接还要手动 ...
- Laravel 5.5 迁移报错:General error: 1215 Cannot add foreign key constraint
问题 之前一直用的 Laravel 5.4,数据库也是直接写 sql 的,感觉可定制性更强,顺便锻炼下 sql.这次改用了 Laravel 5.5,索性用迁移建库试试,结果报错如下: SQLSTATE ...
- marshmallow: 简化Python对象系列化
转载:http://www.thinksaas.cn/topics/0/594/594368.html marshmallow -一个轻量级的库用于将复杂对象转成简单的Python数据类型.或从简单的 ...
- Interger不可变原理
1.先看代码: package main.java.db.mq; public class TestSwap { public static void main(String[] args) { In ...
- HDU 6215 2017Brute Force Sorting 青岛网络赛 队列加链表模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6215 题意:给你长度为n的数组,定义已经排列过的串为:相邻两项a[i],a[i+1],满足a[i]&l ...
- ksh函数
在不同的shell环境里,shell脚本的写法是不同的 此链接为ksh环境的函数写法: https://blog.csdn.net/shangboerds/article/details/487115 ...
- ubuntu 16.04 网卡配置 虚拟机上网
看所有网卡(包括未启动的) ifconfig -a 或者 ip link 查看当前网卡配置,打开配置文件/etc/network/interfaces 设置静态IP(dhcp 为动态获取,static ...
- bash常用快捷键和命令
在使用Linux的时候,最常见的终端解释器就是bash了.bash下有很多技巧,我知道这么几个: 0.关于按键模式bash默认的按键模式是emacs风格的.你也可以通过set -i vi设定为vi风格 ...
- KnockoutJs学习笔记(一)
由于工作需要,接触到了Knockout,但是之前对于前台开发真的是不太了解,只能是摸着石头过河,边学边实践了. Knockout的官方网站是:http://knockoutjs.com/.我也是跟着官 ...