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如 ...
随机推荐
- 第二次:Ubuntu16.04 系统怎么截图
一开始想着写文章不用图,全靠文字描述,可是我错了,技术类文字没有图怎么能说的清楚,于是乎开始找在Ubuntu系统下的截图工具,网络神奇,发现了这个,以下命令可以反复试试: ubuntu 会自带一款截图 ...
- python 安装模块 更新模块
#显示模块pip list #显示过期模块pip list --outdated #安装模块pip install xxx #升级模块pip install --upgrade xxx
- 多.h项目出现的问题:使用了预编译头依然出现error LNK2005:***obj已在***obj中定义与c++ error C2011: “xxx”:“class”类型重定义解决办法
使用了预编译头依然出现error LNK2005:***obj已在***obj中定义 造成该问题的可能性比较多,本人将在今后遇到时添加进来,今天先放出本人遇到的一种情况. 多重包含含有变量定义的.h文 ...
- Codeforce 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集&分组背包)
题意: 给定n个价值为b 花费为w的物品, 然后某些物品是属于同一个组的, 给定一个花费限制V, 求在小于等于V的情况下取得到的价值最大为多少,能对于同一个组的物品,要么全取,要么只取一个. 分析: ...
- java中"=="和equals方法究竟有什么区别?
为什么会说到这个问题呢,是因为在java中遇到这个问题太常见了,无论是在写代码时还是在面试时.下面就一起探讨一下它们之间的联系与区别吧. 首先对于这样的问题,一般是先单独把一个东西说清楚,然后再说另一 ...
- os系统安装Python虚拟环境virtualenv和virtualenvwrapper
一.安装Python 上节已经讲了如何安装Python2和Python3 二.给Python3安装virtualenv 在终端输入:sudo pip3 install virtualenv 等待安装成 ...
- 主席树初探--BZOJ2588: Spoj 10628. Count on a tree
n<=100000的点权树,有m<=100000个询问,每次问两个点间的第k小点权,保证有解,强制在线. 主席上树啦!类似于之前的序列不带修改询问的前缀表示法,现在只要把前缀当成某点到根的 ...
- 牛客网小白月赛1 B,I
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> ...
- Ubuntu 16.04使用sudo apt-get -f install解决依赖时的注意事项(重点)
注意:在觉得软件依赖时,一般使用sudo apt-get -f install,但是也是非常危险的,尤其时一些软件需要删除某些依赖时,会导致原有安装的软件全部卸载.所以使用此命令时要时刻注意输出的这条 ...
- HAProxy教程收集
市面上HA的教程不是很多,基本都是基于LVS+HA实践的打包资料. 要最权威的文档应该去官方. 官方文档入口: http://www.haproxy.org/#docs 中文文档收集: http:// ...