【LOJ】#2178. 「BJOI2017」机动训练
题解
遇见平方和就转有序对呗
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」机动训练的更多相关文章
- Loj #3042. 「ZJOI2019」麻将
Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3055. 「HNOI2019」JOJO
Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...
随机推荐
- php中的动态变量的一个应用
原文:https://www.cnblogs.com/JimmyBright/p/9869168.html 某些情况下,可以代替switch语句,大大简化代码,非常有意思哦 $list = [ [ ' ...
- 洛谷 P3975 [TJOI2015]弦论 解题报告
P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...
- vmware:Could not open /dev/vmmon: No such file or directory.
Q: Could not open /dev/vmmon: No such file or directory. Please make sure that the kernel module `vm ...
- Dom选择器--内容文本操作
一.文本内容操作 内容: <body> <div id="i1"> 学习是我快乐? <a>晚饭吃什么</a> </div> ...
- java基础-网络编程(Socket)技术选型入门之NIO技术
java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...
- 项目中经常用到的JavaScript方法
1. js切割字符串 String.split() 注意:此方法与Array.join执行的方法是相反的. 2. js把数组中所有元素放入一个字符串 Array.join()
- uva 10625 Board Wrapping
https://vjudge.net/problem/UVA-10652 给出n个长方形,用一个面积尽量小的凸多边形把他们围起来 求木板占包装面积的百分比 输入给出长方形的中心坐标,长,宽,以及长方形 ...
- JS 简易控制台插件 [供 博客, 论坛 运行js用]
今天厚着脸皮来推荐下鄙人写的一个小插件吧.看过我博客的应该都熟悉这个插件了,其实就是这货. 这东西是我去年写的,当时水平也不怎么样,不过好歹还是实现了简单功能.我先简单介绍下这东西什么用吧. 因为在 ...
- Windows修改默认远程端口号3389
1.打开注册表:运行-regedit: 2.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\ ...
- innobackupex做MySQL增量备份及恢复【转】
创建备份用户 mysql> grant process,reload,lock tables,replication client on *.* to 'backup'@'localhost' ...