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种颜色给它涂色,要求曼哈顿距离为奇数的格子之间 ...
随机推荐
- SecureCRT通过密钥登录
转载 https://blog.csdn.net/langkeziju/article/details/53024031 说明:一般的密码方式登录容易被密码暴力破解.所以一般我们会将 SSH 的端口 ...
- 异步任务分发模块Celery
Celery简介 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单. celery适用异步处理问题,当遇到发送邮件.或者文件上传, 图像处理等等一些比较耗时的 ...
- java 重写和重载的区别
重写:重写是子类的方法覆盖父类的方法,有两个重要特点 1.子类方法名和参数类型.个数必须和父类一样. 2.如果有返回值,则返回值类型也必须和父类一样. //父类 public class Bird() ...
- leetcode-mid-math - 69. Sqrt(x)-NO
mycode memory error class Solution(object): def mySqrt(self, x): """ :type x: int : ...
- 常见iPhone设备尺寸及分辨率(持续更新)
开发中常用的px与pt区别 px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英寸. px全称为pixel,是一个点,它不是自然界的长度 ...
- 自动化运维--ansible(2)
问题一:如何在多台服务器中配置Web项目上线的所有环境 解答: 1.使用ansible配置nginx服务 在安装前了解rpm与yum的区别 rpm是压缩包安装依赖包需要自己手动安装,yum安装解决依 ...
- Windows操作路由表
route print route add 172.17.0.0 mask 255.255.0.0 192.168.99.100 route delete 172.17.0.0 mask 255.25 ...
- linux和mac 终端代理
概述 今天发现本地服务不能翻墙,查找了下原因,是因为小飞机在 linux 系统上即使开了全局代理还是不能代理终端的,需要开启终端代理才行.方法我记录下来,供以后开发时参考,相信对其他人也有用. 注意: ...
- Linux_RHEL7_LDAP、Autofs服务
目录 目录 前言 LDAP 加入LDAP用户认证服务器 文件自动挂载服务autofs 前言 LDAP服务器,用作于网络用户的集中管理.在企业中员工的个人帐号一般采用集中管理的方式,在不同的系统平台上也 ...
- 阶段3 1.Mybatis_11.Mybatis的缓存_4 mybatis一对多实现延迟加载
改成单表查询 首先配置的是select.他需要配置的值是accountDao中的方法,查询所有的账户,但是必须有条件.根据用户的id column配置的是id.因为要用user表的id去关联查询 Ac ...