【题目大意】

$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. UCP协议

    UDP只在ip数据报的服务上增加了一点功能,就是复用和分用还有差错检验的功能 (1)UDP是面向无连接:发送之前不需要建立连接,减少了时间延续 (2)UDP只是尽最大努力交付,不能保证无措 (3)UD ...

  2. lintcode-39-恢复旋转排序数组

    39-恢复旋转排序数组 给定一个旋转排序数组,在原地恢复其排序. 说明 什么是旋转数组? 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4, ...

  3. iOS开发SDWebImage源码解析之SDWebImageManager的注解

    最近看了两篇博客,写得很不错,关于SDWebImage源码解析之SDWebImageManager的注解: 1.http://www.jianshu.com/p/6ae6f99b6c4c 2.http ...

  4. AMH面板命令操作大全

    LNMP面板 - AMH 命令使用nginx篇 » SSH Nginx1) 有步骤提示操作: ssh执行命令: amh nginx然后选择对应选项进行操作. 2) 或直接操作: 启动Nginx: am ...

  5. matlab怎么选取excel的特定列构成数组

    例如:

  6. matlab中滤波函数

    matlab自带滤波器函数小结(图像处理)   1 线性平滑滤波器 用MATLAB实现领域平均法抑制噪声程序: I=imread(' c4.jpg '); subplot(231) imshow(I) ...

  7. Android基础------SQLite数据库(二)

    1.操作SQLite数据库 1.1 execSQL() 可以执行insert.delete.update和CREATE TABLE之类有更改行为的SQL语句 1.2 rawQuery() 可以执行se ...

  8. springBoot按条件装配:Condition

    编码格式转换器接口 package com.boot.condition.bootconditionconfig.converter; /** * 编码格式转换器接口 */ public interf ...

  9. iOS-系统 图片、视频 管理控制器UIImagePickerController

        UIImagePickerController 是一个管理系统多媒体文件库(相册)中的图片.视频文件的视图控制器,诞生于iOS4之前,虽然功能不是很完善,我们仍可以用这个视图控制器做一些有创造 ...

  10. bzoj4332[JSOI2012]分零食

    一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存 ...