P3713 [BJOI2017]机动训练
这个题简直神仙,求相同路径的平方就等于两个人走相同路径的方案数。然后。。。暴力搜索+记忆化就行了,比较玄学。
题干:
题目描述 整个岛可以看作一片 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]机动训练的更多相关文章
- [BZOJ4859][BJOI2017]机动训练(DP)
4859: [BeiJing2017]机动训练 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 105 Solved: 63[Submit][Stat ...
- BJOI2017 机动训练
落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...
- 【LOJ】#2178. 「BJOI2017」机动训练
题解 遇见平方和就转有序对呗 dp类似从很多点出发每次走一步的转移方式 然后我too naive的,枚举路径长度来决定更新次数,愉快TLE 改成记搜就过了 代码 #include <bits/s ...
- bzoj 4859 [BeiJing2017]机动训练
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4859 题解 和管道取珠类似 首先把平方转化成两条路径经过的图案相同的方案数 对于一条路径 方 ...
- 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题) ...
- NOI Online #2 提高组 游记
没 NOI Online 1 挂的惨就来写游记吧,不知道为啥 NOI Online 1 民间数据测得 60 分的 T1 最后爆零了... 昏昏沉沉的醒来,吃了早饭,等到 \(8:30\) 进入比赛网页 ...
- 一个小 Trick
平方变两次 一个状态 \(S\) 有一个贡献,所有状态 \(S\) 组成集合 \(U\) . 然后我们要统计下面这个东西 \[ans=\sum_{S\in U}f^2(S) \] 然后我们就可以看作是 ...
- BJOI做题记录
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...
- SSD框架训练自己的数据集
SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...
随机推荐
- python各种推导式分析
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- PHP:GD库 生成验证码图片
文章来源:http://www.cnblogs.com/hello-tl/p/7592998.html <?php /** * __construct($new):构造函数创建一张图片$new- ...
- win10下安装psql9,后无法访问数据库引擎
1.修改安装文件兼容性,并启动安装 2.安装后 修改psql control center快捷方式的启动文件兼容性 3.修改 start workgroup engine 快捷方式的启动文件兼容性 一 ...
- Python爬虫例子(笔记,不适合参考,愿意看的可以看看)
话不多说,直接上代码: import re import csv #爬虫的一个小例子,爬的是百度贴吧(网页版)某个帖子的各个楼层的用户名,发言内容和发言时间(使用到了正则表达式) source3.tx ...
- 如何设置路由器的MTU
前几天搞了个ER-X,总觉得没有发挥其最大的能力.今天查了下如何设置MTU,罗列如下,备忘. 1. 目前都是PPPOE,这个不管网络如何复杂,均不要在路由后面计算封包大小.正确的是电脑直接连猫,直接拔 ...
- String字符串类的获取功能
StringDemo.java /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char charAt(int index):获取指定索引 ...
- STM32F407 跑马灯 库函数版 个人笔记
原理图: MCU在开发板原理图的第二页,LED在开发板原理图的第三页 由图可知,PF9 ,PF10 若输出低电平则灯亮,高电平则灯灭 选推挽输出 代码步骤 使能IO口时钟. 调用函数RCC_AHB1P ...
- POJ-3692Kindergarten,求最大独立集!
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Description In a kindergarten, there ar ...
- HTML5 & CSS3 & font-family
HTML5 & CSS3 & font-family 中文字体的英文名称 宋体* SimSun 黑体* SimHei 微软雅黑* Microsoft YaHei 微软正黑体 http: ...
- 【转】 Java中的IO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...