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

时间:2022-04-09 13:36:33

题解

遇见平方和就转有序对呗

dp类似从很多点出发每次走一步的转移方式

然后我too naive的,枚举路径长度来决定更新次数,愉快TLE

改成记搜就过了

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 100005
#define mo 994711
//#define ivorysi
using namespace std;
typedef long long int64;
typedef long double db;
typedef unsigned int u32;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
const int MOD = 1000000009;
int N,M,dp[35][35][35][35],cur,cnt;
char s[35][35];
int dx[2][5],dy[2][5];
int X[3] = {0,1,1};
int Y[3] = {1,0,1};
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
inline bool check(int on,int x,int y,int d,int c) {
if(X[c] && (!dx[on][d])) return false;
if(Y[c] && (!dy[on][d])) return false;
int tx = x + X[c] * dx[on][d];
int ty = y + Y[c] * dy[on][d];
if(tx < 1 || tx > N) return false;
if(ty < 1 || ty > M) return false;
return true;
}
int DP(int x1,int y1,int x2,int y2,int l,int v) {
if(dp[x1][y1][x2][y2] != -1) return dp[x1][y1][x2][y2];
if(s[x1][y1] != s[x2][y2]) return 0;
dp[x1][y1][x2][y2] = 1;
for(int a = 0 ; a <= 2 ; ++a) {
for(int b = 0 ; b <= 2 ; ++b) {
if(check(0,x1,y1,l,a) && check(1,x2,y2,v,b)) {
int tx1 = x1 + X[a] * dx[0][l];
int ty1 = y1 + Y[a] * dy[0][l];
int tx2 = x2 + X[b] * dx[1][v];
int ty2 = y2 + Y[b] * dy[1][v];
update(dp[x1][y1][x2][y2],DP(tx1,ty1,tx2,ty2,l,v));
}
}
}
return dp[x1][y1][x2][y2];
}
int Calc(int Len) {
cur = 0;
int res = 0; for(int l = 0 ; l <= 3 ; ++l) {
for(int v = 0 ; v <= 3 ; ++v) {
memset(dp,-1,sizeof(dp));
for(int i = 1 ; i <= N ; ++i) {
for(int j = 1 ; j <= M ; ++j) {
for(int k = 1 ; k <= N ; ++k) {
for(int h = 1 ; h <= M ; ++h) {
if(s[i][j] != s[k][h]) continue;
update(res,inc(DP(i,j,k,h,l,v),MOD - 1)); }
}
}
}
}
}
return res;
}
void Solve() {
read(N);read(M);
int ans = 0;
for(int i = 1 ; i <= N ; ++i) scanf("%s",s[i] + 1);
dx[0][0] = dx[1][0] = 1;dx[0][1] = dx[1][1] = 1;dx[0][2] = dx[1][2] = -1;dx[0][3] = dx[1][3] = -1;
dy[0][0] = dy[1][0] = 1;dy[0][1] = dy[1][1] = -1;dy[0][2] = dy[1][2] = 1;dy[0][3] = dy[1][3] = -1;
update(ans,Calc(N + M));
dx[0][0] = 1;dx[0][1] = -1;dx[0][2] = 0;dx[0][3] = 0;
dy[0][0] = 0;dy[0][1] = 0;dy[0][2] = 1;dy[0][3] = -1;
update(ans,MOD - Calc(max(N,M)));
for(int i = 0 ; i <= 3 ; ++i) {
swap(dx[0][i],dx[1][i]);
swap(dy[0][i],dy[1][i]);
}
update(ans,MOD - Calc(max(N,M)));
memcpy(dx[0],dx[1],sizeof(dx[1]));
memcpy(dy[0],dy[1],sizeof(dy[1]));
update(ans,Calc(max(N,M)));
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【LOJ】#2178. 「BJOI2017」机动训练的更多相关文章

  1. Loj &num;3042&period; 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  2. Loj &num;2192&period; 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  3. Loj &num;3096&period; 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  4. Loj &num;3093&period; 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  5. Loj &num;3089&period; 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  6. Loj &num;2542&period; 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  7. Loj &num;3059&period; 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  8. Loj &num;3056&period; 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  9. Loj &num;3055&period; 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

随机推荐

  1. PHP 动态生成验证码

    ……机器人会在网站中搜寻允许他们插入广告的输入表单,在虚拟世界没有什么能阻挡它们胡作非为.这些机器人效率极高,完全不关心所攻击的表单的本来用途.它们唯一的目标就是用它们的垃圾广告覆盖你的内容,残忍地为 ...

  2. 如何利用OCS缓存TomcatSession全局变量(转)

    转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...

  3. Java日期转换SimpleDateFormat格式大全&lpar;转&rpar;

    24小时制时间显示: public class Datetime { public static void main(String args[]){ java.util.Date current=ne ...

  4. POJ 1845 Sumdiv&lpar;因子分解&plus;快速幂&plus;二分求和&rpar;

    题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...

  5. Unity3D 3D横版跑酷 跳跃

    Unity3d 跑酷动画的控制 首先给个图吧, 我们跑酷里面需要动画的,今天说一下动画的知识! 1.导入骨骼动画模型文件之后,如果使用之前版本的unity的播放动画的方式,需要设置AnimationT ...

  6. 史上最全的css hack

    <!DOCTYPE html> <html> <head> <title>Css Hack</title> <style> #t ...

  7. deb包&plus;软件图标&plus;添加到系统菜单&plus;举例安装卸载

    本文介绍的内容和实验一下: 1. 制造deb包.2. 为了使软件图标.3. 开始菜单中添加到系统中的软件:4. 安装和卸载制作的deb包. 1. 制作deb包 制作deb包的方法可能有多种,本文使用的 ...

  8. 5&period;Hibernate实现全套增删改查和ajax异步分页

    1.1 创建如下oracle数据库脚本 drop sequence seq_stu; create sequence SEQ_STU minvalue maxvalue start increment ...

  9. Docker公共&amp&semi;本地镜像仓库(七)--技术流ken

    分发镜像 我们已经会构建自己的镜像了,那么如果在多个docker主机上使用镜像那?有如下的几种可用的方法: 用相同的Dockerfile在其他host上构建镜像 将镜像上传到公共registry(比如 ...

  10. &lbrack;UE4&rsqb;嵌套Canvas