这个题简直神仙,求相同路径的平方就等于两个人走相同路径的方案数。然后。。。暴力搜索+记忆化就行了,比较玄学。

题干:

题目描述

整个岛可以看作一片 n*m 的区域,每个格子有自己的地形。

一条路径由一系列八连通的格子组成,两个格子八连通当且仅当这两个格子拥有公共的

顶点。

定义一条“机动路径”如下:

、它是一条不自交的路径,即路径上任意两个格子都不是同一个

、它的起点和终点处于不同位置,换言之这条路径至少包含  个格子

、从起点开始,任何一步只能向不远离终点的方向移动,这里不远离指的是 x 和 y 两

个方向都不远离

举例说明(字符画需要用等宽字体查看):

.....y ...... .---.
-++... ---... .-x-.
-x+... -x+..y .-+-.
---... ---... ..y.. 图中加号和减号标明了与 x 八连通的所有格子,其中加号是“不远离 y”的方向 因此可以看出,如下路径是机动路径: ++++++y ......+y .......y
+...... .....++. ......+.
+...... ..++++.. ...+++..
x...... x++..... x+++.... 而如下路径不是机动路径: \../---y .......y .x.
|--..... ....../. /..
|....... x..../.. \..
x....... .\--/... .y. 需要注意的是,某些不合法的路径甚至比机动路径还要短,这是因为机动路径不是按照 长度来定义的。 接下来定义一条机动路径的地形,岛上的地形由一个矩阵给出,如 .**.
*..*
*..*
.**.
那么,一条机动路径的地形序列就是它所经过的地形排成一列,如
x-\.
...\
...|
...y 的地形序列就是".****."(不包含引号) 每条机动路径的权重就是与之拥有相同地形序列的机动路径数量之和,例如与这条路径 拥有相同地形序列的路径有 ./-y y... ...x x-\. ./-x x... ...y y-\.
/... |... ...| ...\ /... |... ...| ...\
|... \... .../ ...| |... \... .../ ...|
x... .\-x y-/. ...y y... .\-y x-/. ...x 共 条,注意回文时正反算两条,以及自己也算一条。 所以这条机动路径的权重是 ,同时所有这 条机动路径的权重都是 。 现在你需要统计所有的机动路径权重之和。 如果对这种统计方式没有直观的感受,可以查看样例说明。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = ,mod = ;
int n,m,f[N][N][N][N],g[][][][],ans;
int dx[],dy[],dp[],dq[],tp1,tp2;
char str[N][N];
int DP(int x,int y,int p,int q)
{
if(str[x][y] != str[p][q]) return ;
if(x < || x > n || y < || y > m) return ;
if(p < || p > n || q < || q > m) return ;
if(f[x][y][p][q] != -) return f[x][y][p][q];
int res = ;
duke(i,,tp1)
{
duke(j,,tp2)
{
res = (res + DP(x + dx[i],y + dy[i],p + dp[j],q + dq[j])) % mod;
}
}
return f[x][y][p][q] = res;
}
int Calc(int x,int y,int p,int q)
{
if(g[x + ][y + ][p + ][q + ] != -) return g[x + ][y + ][p + ][q + ];
tp1 = ;
duke(i,-,)
{
if(!i || i == x)
{
duke(j,-,)
{
if((i || j) && (!j || j == y))
{
tp1++;
dx[tp1] = i;
dy[tp1] = j;
}
}
}
}
tp2 = ;
duke(i,-,)
{
if(!i || i == p)
{
duke(j,-,)
{
if((i || j) && (!j || j == q))
{
tp2++;
dp[tp2] = i;
dq[tp2] = j;
}
}
}
}
int res = ;
memset(f,-,sizeof(f));
duke(i,,n)
{
duke(j,,m)
{
duke(k,,n)
{
duke(l,,m)
{
res = (res + DP(i,j,k,l)) % mod;
}
}
}
}
g[x + ][y + ][p + ][q + ] = res;
g[p + ][q + ][x + ][y + ] = res;
g[-x + ][-y + ][-p + ][-q + ] = res;
g[-p + ][-q + ][-x + ][-y + ] = res;
return res;
}
int calc(int x,int y)
{
int res = ;
res = (res + Calc(x,y,,)) % mod;
res = (res + Calc(x,y,,-)) % mod;
res = (res + Calc(x,y,-,)) % mod;
res = (res + Calc(x,y,-,-)) % mod;
res = (res - Calc(x,y,,) + mod) % mod;
res = (res - Calc(x,y,-,) + mod) % mod;
res = (res - Calc(x,y,,) + mod) % mod;
res = (res - Calc(x,y,,-) + mod) % mod;
return res;
}
int main()
{
read(n);read(m);
duke(i,,n)
{
scanf("%s",str[i] + );
}
memset(g,-,sizeof(g));
ans = (ans + calc(,)) % mod;
ans = (ans + calc(,-)) % mod;
ans = (ans + calc(-,)) % mod;
ans = (ans + calc(-,-)) % mod;
ans = (ans - calc(,) + mod) % mod;
ans = (ans - calc(-,) + mod) % mod;
ans = (ans - calc(,) + mod) % mod;
ans = (ans - calc(,-) + mod) % mod;
printf("%d\n",ans);
return ;
}

P3713 [BJOI2017]机动训练的更多相关文章

  1. [BZOJ4859][BJOI2017]机动训练(DP)

    4859: [BeiJing2017]机动训练 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 105  Solved: 63[Submit][Stat ...

  2. BJOI2017 机动训练

    落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...

  3. 【LOJ】#2178. 「BJOI2017」机动训练

    题解 遇见平方和就转有序对呗 dp类似从很多点出发每次走一步的转移方式 然后我too naive的,枚举路径长度来决定更新次数,愉快TLE 改成记搜就过了 代码 #include <bits/s ...

  4. bzoj 4859 [BeiJing2017]机动训练

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4859 题解 和管道取珠类似 首先把平方转化成两条路径经过的图案相同的方案数 对于一条路径 方 ...

  5. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  6. NOI Online #2 提高组 游记

    没 NOI Online 1 挂的惨就来写游记吧,不知道为啥 NOI Online 1 民间数据测得 60 分的 T1 最后爆零了... 昏昏沉沉的醒来,吃了早饭,等到 \(8:30\) 进入比赛网页 ...

  7. 一个小 Trick

    平方变两次 一个状态 \(S\) 有一个贡献,所有状态 \(S\) 组成集合 \(U\) . 然后我们要统计下面这个东西 \[ans=\sum_{S\in U}f^2(S) \] 然后我们就可以看作是 ...

  8. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  9. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

随机推荐

  1. Atcoder regular Contest 073(D - Simple Knapsack)

    Atcoder regular Contest 073(D - Simple Knapsack) 传送门 因为 w1≤wi≤w1+3 这个特殊条件,我们可以将每个重量离散化一下,同时多开一维记录选择的 ...

  2. admin源码之url设计

    如何实现批量设计url? 1.创建Django项目 2.新建app01 和 app02 3.在models.py中创建模型 4.在settings.py中完成数据库配置.app配置等 5.数据库迁移 ...

  3. java手工从键盘输入数字存放到数组并将其输出

    package suanfafenxi; import java.util.Scanner; public class shiyan { static int number=10; static in ...

  4. 全排列函数 nyoj 366(next_permutation()函数)

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...

  5. [luoguP1058] 立体图(超级大模拟(¬︿̫̿¬☆))

    传送门 看到题后整个人成了mengbier 但是仔细分析一下就很简单了,先确定好输出的图的长和宽. 然后从输入的矩形的左上角的最下面的开始填充,顺序是从下到上,从左到右,从后往前. 填充的时候直接覆盖 ...

  6. [网络流24题] 骑士共存(cogs 746)

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  7. 【ZJOI2017 Round1游记】

    DAY0: 中午12点出发,下午5点到 酒店意外豪华 晚上和MG,LYY们定了个寿司套餐 没什么学习就睡觉了 DAY1: 听说RYZ在ZJ的OIer中影响颇深 讲STL的小哥真是对不住因为我是P党 D ...

  8. LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤

    有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...

  9. 转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

    这类的工具有 比如 :LeakDiag leakfinder "Visual Leak Detector" vld可以从http://vld.codeplex.com/releas ...

  10. HDU4325 树状数组+离散化

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325 Flowers Time Limit: 4000/2000 MS (Java/Others)   ...