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如 ...
随机推荐
- linux性能优化cpu-01性能指标
学习性能优化的第一步,一定要了解性能指标. 性能指标是什么? 当我们看到性能指标时一定先想到“高并发”.“响应快”,这个两个指标也对应着性能优化的两个核心指标—— “吞吐率”和“低延迟”. 这两个指标 ...
- CentOS 6, 编译安装lamp (php-fpm)
1 整体要求 php-fpm.httpd.mysql三者分别安装在三台虚拟机上: 第一台虚拟主机用于安装Mariadb,第二台虚拟主机安装php-fpm:第三台虚拟主机安装httpd.三台主机安装完之 ...
- Fiddler简介与Web抓包,远程抓包(IE、360、谷歌、火狐)
Fiddler简介以及web抓包 一.Fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二 ...
- 九度oj 题目1438:最小公倍数
题目1438:最小公倍数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2451 解决:2057 题目描述: 给定两个正整数,计算这两个数的最小公倍数. 输入: 输入包含多组测试数据,每 ...
- JavaEE JDBC 可滚动和可更新的结果集ResultSet
可滚动和可更新的结果集ResultSet @author ixenos 需求背景 1.对于一个只需要分析数据的程序来说,普通的ResultSet已够用 2.但如果ResultSet用于显示一张表或查询 ...
- Maven 引入外部包
当需要从外部引入一个包(譬如说读写Excel 的POI jar 包 ), 不需要手动地去官网下载一个包然后粘贴到相应的地方. 只需要把Java 工程 转为 Maven 工程 ( 在工程上右键 > ...
- [codeforces471D]MUH and Cube Walls
[codeforces471D]MUH and Cube Walls 试题描述 Polar bears Menshykov and Uslada from the zoo of St. Petersb ...
- Django用法补充
1. 自定义Admin from django.contrib import admin from xx import models # 自定义操作 class CustomerAdmin(admin ...
- idea导入(import)项目和打开(open)项目的区别
前言: 每次接手老项目,都得从git或svn下载下来,但是如果之前的项目不是用idea写的怎么办,可是你又习惯啦idea,那你必须把项目在idea上跑起来,那是用import还是用open呢,如何抉择 ...
- AtCoder Grand Contest 020 D - Min Max Repetition
q<=1000个询问,每次问a,b,c,d:f(a,b)表示含a个A,b个B的字符串中,连续A或连续B最小的串中,字典序最小的一个串,输出这个串的c到d位.a,b<=5e8,d-c+1&l ...