【题目大意】

$1 \leq n,m \leq 400$

N字形表示:上图第1行第1个那种;Z字形表示上图第1行第2个那种。

【题解】

很容易得到结论:

考虑如果紫色比绿色先消去,那么黄色一定会比对应的白色先消去(这样才能消去白色)。

然后我们可以知道,设取走$(x, y)$靠左的正方形,要$L(x,y)$步,那么$L(x,y) \geq L(x,y-1)$,同理也有$L(x, y) \geq L(x, y+1)$。

然后我们对于这个就可以进行一行一行的dfs了,dfs的时候可能会搜到原来已经搜过的状态,我们令flag(x, y) = 2表示(x, y)已经被消掉过,flag(x, y) = 1表示(x, y)正在被消去的过程中,如果搜到flag(x, y) = 1,就说明形成了环状的依赖关系,答案就是-1. 如果flag(x, y) = 2,表示之前已经消过了,返回0即可。

然后。。卡卡常就过了。

判断字符比判断bool慢,所以用bool代替char的map;然后因为判断新的$(x', y')$在不在边界里要判断很多,如果在边界外也返回0,所以我们直接设置他们的flag = 2即可。

然后就过了。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int N = 4e2 + , M = 2e5 + , inf = 1e9; # define ST static
# define RG register int n, m;
ST bool mp[N][N];
ST int f[N][N], g[N][N];
ST int flag[N][N];
const int dx[] = {, , -, }, dy[] = {, , , -}; inline int dfs(int x, int y, int face) {
if(flag[x][y] == ) return inf;
if(flag[x][y] == ) return ;
flag[x][y] = ;
int ret = ;
if(mp[x][y]) {
ret += dfs(x + dx[face], y + dy[face], face);
face ^= ;
ret += dfs(x + dx[face], y + dy[face], face);
} else {
ret += dfs(x + dx[face], y + dy[face], face);
face ^= ;
ret += dfs(x + dx[face], y + dy[face], face);
}
flag[x][y] = ;
if(ret > inf) ret = inf;
return ret;
} int main() {
// freopen("sandwich.in", "r", stdin);
// freopen("sandwich.out", "w", stdout);
cin >> n >> m;
for (RG int i=; i<=n; ++i) {
getchar();
for (RG int j=; j<=m; ++j) mp[i][j] = (getchar() == 'N');
}
for (RG int i=; i<=n; ++i) {
memset(flag, , sizeof flag);
for (RG int j=; j<=m; ++j) flag[][j] = flag[n+][j] = ;
for (RG int j=; j<=n; ++j) flag[j][] = flag[j][m+] = ;
for (RG int j=; j<=m; ++j) f[i][j] = min(inf, f[i][j-] + dfs(i, j, ));
}
for (RG int i=; i<=n; ++i) {
memset(flag, , sizeof flag);
for (RG int j=; j<=m; ++j) flag[][j] = flag[n+][j] = ;
for (RG int j=; j<=n; ++j) flag[j][] = flag[j][m+] = ;
for (RG int j=m; j; --j) g[i][j] = min(inf, g[i][j+] + dfs(i, j, ));
}
for (RG int i=, ans; i<=n; ++i, puts(""))
for (RG int j=; j<=m; ++j) {
ans = min(f[i][j], g[i][j]);
if(ans == inf) printf("-1 ");
else printf("%d ", ans << );
}
return ;
}

「6月雅礼集训 2017 Day7」三明治的更多相关文章

  1. 「6月雅礼集训 2017 Day7」电报

    [题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 ...

  2. 「6月雅礼集训 2017 Day7」回转寿司

    [题目大意] 给一个n个数的序列,q次操作,每次选择区间$[l,r]$,给出数p,对于区间$[l,r]$的每个数$x$,做如下操作: 如果$x > p$,就交换$x$和$p$.求每次操作后$p$ ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  5. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  6. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  7. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  8. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  9. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

随机推荐

  1. 【Docker 教程】- Docker 架构

    1.Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. 2.Docker 容器通过 Docker 镜像来创建. 3.容器与镜像的关系类似于面向对象编程 ...

  2. phpcms开启在线编辑模版 方法

    目录:\caches\configs\system.php 将:第20行 'tpl_edit'=> 0   修改为  'tpl_edit'=> 1   (0:默认的,不开启:     1: ...

  3. 实现一个可以实时提示的textarea组件

    该组件输入.换行.变换光标可以实时给出提示 效果: textarea.vue <template> <div> <el-input id="user-input ...

  4. CSS设计指南之一 HTML标记与文档结构

    HTML标记与文档结构 之所以从HTML讲起,是因为CSS的用途就是为HTML标记添加样式. 1.1 HTML标记基础 对于每个包含内容的元素,根据它所包含的内容是不是文本,有两种不同的方式给它们加标 ...

  5. InnoDB,select为啥会阻塞insert?

    MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一. 但是,如<InnoDB,5项最佳实践>所述,如果查询没有命中索引,也将退化为表锁. InnoDB的细粒度锁,是实现在索引记录 ...

  6. 在ios 上 按钮 disabled 样式显示异常

    将input,button或textarea设置为disabled后,在iphone手机上样式将被覆写-webkit-appearance:none; 文字的颜色还是灰色. 原本在android 上 ...

  7. tcp协议的六个标识位

    6个标识位: URG 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据. ACK 置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略. PSH 置1时请求的数据段在接收方得到 ...

  8. CentOS 文件搜索find

    1.文件搜索,内置的的命令是find 用法: find [查找路径] 寻找条件 操作 默认路径为当前目录:默认表达式为 -print 2.主要参数: -name 匹配名称 -perm 匹配权限(mod ...

  9. Unable to open connection to "Microsoft SQL Server, provider V1.0.5000.0 in framework

    解决办法:1 以管理员身份登陆2 找到ORACLE_HOME文件夹(D:\oracle\ora92),点右键,选属性——安全,在组或用户栏中选"Authenticated Users&quo ...

  10. [JSOI2010]部落划分 最小生成树

    一道最小生成树经典题 由于是最靠近的两个部落尽可能远,如果我们先处理出任意两个居住点之间的距离并将其当做边,那么我们可以发现,因为在一个部落里面的边是不用计入答案的,所以应该要尽量把小边放在一个部落里 ...