【题目大意】

$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. TensorFlow源码框架 杂记

    一.为什么我们需要使用线程池技术(ThreadPool) 线程:采用“即时创建,即时销毁”策略,即接受请求后,创建一个新的线程,执行任务,完毕后,线程退出: 线程池:应用软件启动后,立即创建一定数量的 ...

  2. 福大软工1816:Alpha(7/10)

    Alpha 冲刺 (7/10) 队名:Jarvis For Chat 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完成 ...

  3. android AndroidManifest.xml uses-feature 详解

    如果你是一个Android用户,而且你有一个老旧的安装有android 1.5 的android设备,你可 能会注意到一些高版本的应用没有在手机上的Android Market 中显示.这必定是应用使 ...

  4. Swift-枚举enum理解

    //定义一个枚举 //枚举的语法,enum开头,每一行成员的定义使用case关键字开头,一行可以定义多个关键字 enum CompassPoint { case North case South ca ...

  5. 3ds Max学习日记(九)

      添加了几根线条,又跟着教程细扣了一下面部细节,并把鼻子做的更细致了一些,如图:   又做了好久,按着教程抠出了眼睛和嘴,感觉自己做的模型就跟鬼似的...   做了下头发,看了下视频最后,并没教如何 ...

  6. 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能

    本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...

  7. Extensions disabled by Chrome

    Extensions disabled by Chrome https://support.google.com/chrome_webstore/answer/2811969 https://supp ...

  8. deep learning2

    九.Deep learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结 ...

  9. Qt Pro文件与Qt模块启用

    看qt论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 一.从哪开始呢 不妨先看个例子吧: #include <QtCore/QCoreApplication& ...

  10. BZOJ3709 [PA2014]Bohater 【贪心】

    题目链接 BZOJ3709 题解 贪心很显然 我们先干掉能回血的怪,当然按照\(d\)升序顺序,因为打得越多血越多,\(d\)大的尽量往后打 然后再干掉会扣血的怪,当然按照\(a\)降序顺序,因为最后 ...