Codeforces1214D. Treasure Island (dp + Hash)
题目链接:传送门
思路:
仔细观察可以发现,答案最多就是2,只要把(2,1)和(1,2)堵住就可以了。
答案是0的情况就是初始状态下,(1,1)就已经不可达(n,m)了,很好判断。
所以重点就是区分答案为1和答案为2的情况。
如果答案为1的话,就说明从(1,1)到(n,m)的所有路径都经过同一个点(这样的点至少一个)。
实际上,求出(1,1)出发可达的所有点的集合S1,和所有可达(n,m)的点S2。这里用dp来跑可以O(nm)。其中坐标要压成一维的(因为n、m的范围没有给出),否则不好开内存。
再以到(1,1)的曼哈顿距离相同为条件,把两个点集划分成O(n+m)个集合。
这些集合的大小的最小值,就是答案。
代码:O(nm)
#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define N 1000005
#define INF 0x3f3f3f3f
#define mk(x) (1<<x) // be conscious if mask x exceeds int
#define sz(x) ((int)x.size())
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mp(a,b) make_pair(a, b)
#define endl '\n'
#define lowbit(x) (x&-x) using namespace std;
typedef long long ll;
typedef double db; int n, m;
inline int getx(int t) {
return t / m;
}
inline int gety(int t) {
return t % m;
}
inline int gett(int x, int y) {
return x*m + y;
} char s[N];
bool vis11[N], visnm[N];
int main()
{
cin >> n >> m;
memset(vis11, false, sizeof vis11);
memset(visnm, false, sizeof visnm);
for (int i = ; i < n; i++)
scanf("%s", s + i*m);
vis11[] = visnm[n*m-] = true;
for (int t = ; t < n*m-; t++) {
int x = getx(t), y = gety(t);
if (s[t] == '#') continue;
if (x == ) {
int pret = gett(x, y-);
vis11[t] = vis11[pret];
}
else if (y == ) {
int pret = gett(x-, y);
vis11[t] = vis11[pret];
}
else {
int pret1 = gett(x, y-);
int pret2 = gett(x-, y);
vis11[t] = vis11[pret1] || vis11[pret2];
}
}
for (int t = n*m-; t > ; t--) {
int x = getx(t), y = gety(t);
if (s[t] == '#')
continue;
if (x == n-) {
int pret = gett(x, y+);
visnm[t] = visnm[pret];
}
else if (y == m-) {
int pret = gett(x+, y);
visnm[t] = visnm[pret];
}
else {
int pret1 = gett(x, y+);
int pret2 = gett(x+, y);
visnm[t] = visnm[pret1] || visnm[pret2];
}
}
int ans = ;
for (int d = ; d < n+m-; d++) {
int x = , y = d;
if (y >= m) {
y = m-;
x = d-y;
}
int cnt = ;
for (; x < n && y >= ; x++, y--) {
int tmpt = gett(x, y);
if (vis11[tmpt] && visnm[tmpt])
cnt++;
}
if (cnt == ) {
ans = ;
break;
}
if (cnt == )
ans = ;
}
cout << ans << endl;
return ;
}
Codeforces1214D. Treasure Island (dp + Hash)的更多相关文章
- 取数字(dp优化)
取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- [Codeforces722E] Research Rover (dp+组合数学)
[Codeforces722E] Research Rover (dp+组合数学) 题面 给出一个N*M的方格阵,从(1,1)出发,到(N,M)结束,从(x,y)只能走到(x+1,y)或(x,y+1) ...
- 数据库里账号的密码,需要怎样安全的存放?—— 密码哈希(Password Hash)
最早在大学的时候,只知道用 MD5 来存用户的账号的密码,但其实这非常不安全,而所用到的哈希函数,深入挖掘,也发现并不简单-- 一.普通的 Hash 函数 哈希(散列)函数是什么就不赘述了. 1.不推 ...
- ZOJ 2672 Fibonacci Subsequence(动态规划+hash)
题意:在给定的数组里,寻找一个最长的序列,满足ai-2+ai-1=ai.并输出这个序列. 很容易想到一个DP方程 dp[i][j]=max(dp[k][i])+1. (a[k]+a[i]==a[j], ...
- Rikka with Subset HDU - 6092 (DP+组合数)
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...
- 【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)
题面戳我 Solution 首先长度为偶数可以直接判掉 然后我们可以枚举删的位置,通过预处理的\(hash\),判断剩余部分是否划分成两个一样的 判重要注意,我们把字符串分为三个部分\(L_l+1+L ...
- 合法括号序列(dp+组合数学)
键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...
- LightOJ - 1246 Colorful Board(DP+组合数)
http://lightoj.com/volume_showproblem.php?problem=1246 题意 有个(M+1)*(N+1)的棋盘,用k种颜色给它涂色,要求曼哈顿距离为奇数的格子之间 ...
随机推荐
- PTA编程总结二
7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...
- JavaScript json loop item in array
Iterating through/Parsing JSON Object via JavaScript 解答1 Your JSON object is incorrect because it ha ...
- Python深度学习读书笔记-6.二分类问题
电影评论分类:二分类问题 加载 IMDB 数据集 from keras.datasets import imdb (train_data, train_labels), (test_data, t ...
- 创建Stream
1.创建Stream create Stream from Collections; create Stream from values; create Stream from Arrays; cra ...
- OpenStack Placement Project
目录 文章目录 目录 背景 Placement 简介 基本概念 数据模型解析 Command Line Placement Web Application 的实现与分析 Placement 在启动虚拟 ...
- 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除
实现在页面上点击展示页就展示内容,点击新增页就触发新增功能 项目结构 admin.__init__ from flask import Blueprint admin = Blueprint('adm ...
- oracle-不完全数据库恢复-被动恢复-ORA-00313/ORA-00366
继上一篇不完全恢复 oracle-不完全数据库恢复-被动恢复-ORA-00313/ORA-00366 场景2:数据库拥有备份,CURRENT状态日志组中所有的在线日志头损坏,在发生日志切换时实例被自动 ...
- Java之Swing体系——制作自己的登录界面
我们制作登陆界面是简单的图形模式,并不具备其他功能: 这里使用两个库,如下: javax.swing.*; java.awt.*; 构造窗体对象要用到很多类,废话不多,直接代码~ package co ...
- 【Qt开发】状态栏设置
1.在Qt 里面,状态栏显示的信息有三种类型:临时信息.一般信息和永久信息. 其中,临时信息指临时显示的信息,比如QAction 的提示等,也可以设置自己的 临时信息,比如程序启动之后显示Read ...
- ubuntu使用iptables 持久化
iptables 持久化 安装持久化工具apt-get install iptables-persistent Ubuntu 16.04 调用语法netfilter-persistent savene ...