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种颜色给它涂色,要求曼哈顿距离为奇数的格子之间 ...
随机推荐
- python正则之match search findall
match:只匹配一次,开头匹配不上,则不继续匹配 a,b,\w+ match(a,"abcdef") 匹配a >>> re.match("a" ...
- java中的同步和异步
摘自:https://www.cnblogs.com/caotao0918/p/10699785.html 在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种 ...
- 打开远程桌面时总提示无法打开连接文件default.rdp
删除C:\Users\Administrator\Documents\default.rdp,再启动远程就好了 http://www.chahushequ.com/read-topic-94-2fa9 ...
- Spring框架中的依赖注入
依赖注入(DI : Dependency Injection)是基于.xml配置文件内节点的书写. 注入类型: 1.设置注入,调用了Bean的setXXX()进行值注入 普通属性(value值表示要显 ...
- 测开之路一百二十八:flask之重定向和404
a.b两个视图,分别返回a的页面和b的页面 重定向:redirect 重定向到路由:请求/a/时,重定向到/b/ 重定向到视图函数:url_for(“函数名“),访问/a/时,重定向到函数b() 主动 ...
- EncodeError: 'latin-1' codec can't encode characters in position 69-70: ordinal not in range(256)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 69-70: ordinal not in range( ...
- GCC 使用-C语言编译过程
任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...
- redis 锦集
redis 锦集url:http://blog.csdn.net/lqadam/article/category/7479450 1. redis 排序 2.redis 慢查询.位数组和事务 3.re ...
- 【MM系列】SAP 财务帐与后勤不一致情况
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 财务帐与后勤不一致情况 ...
- 第六周学习总结&(实验报告四)
一.实验目的 (1)掌握类的继承方法 (2)变量的继承和覆盖,方法的继承,重载和覆盖实现 二.实验内容 一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实 ...