题目大意:$NOIP2018\;TG\;D2T2$

题解:skip2004博客基础上修改的,也是暴搜。

说明一下把vector改成数组并不可以通过此题,记录

结论:在$m>n+1$时答案为$3(n,m)$($(n,m)$表示长$m$高$n$的矩形的答案)

发现其中判断右下角矩阵斜线全相等的部分可以优化,因为对于一条斜线,每次都搜右下角的矩阵,有很多部分都是重复搜的,完全可以每次搜只与它下面的一层比较,发现一条斜线中最多只有一个$01$交界处,于是对于这一行进行特判,少搜一个,但是注意最下面的一行可能不是底,需要把整个矩阵搜一遍。

这样似乎复杂度是不变的(我数学差),然后交了一下,发现还是会$TLE$,到洛谷$IDE$上测了一下是$1126ms$,于是加上一堆$register$和$const$就过了,最慢的点$925ms$。

我在洛谷$IDE$上又试了一下,原来全部搜一遍的代码加上$register$和$const$用时是$1263ms$(所有测试数据均为   )

卡点:$TLE$

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 10
const int mod = 1e9 + 7;
inline int pw(int base, int p) {
if (p < 0) return 1;
int res = 1;
for (; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
return res;
}
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;} int n, m, ans;
int s[maxn][maxn];
struct node {
int x, y;
inline node() {};
inline node(int __x, int __y) {x = __x, y = __y;}
} v[maxn << 1][maxn];
int tot[maxn << 1]; void dfs(const int X) {
if (X < 2) {
ans++;
return ;
}
for (register node *i = v[X + 1]; i -> x; i++) {
const int x = i -> x, y = i -> y;
if (1 < x && x < n && y < m) {
if (x == X) {
if (s[x][y] == s[x - 1][y + 1]) {
for (register int j = x; j < n; j++) {
for (register int k = y + 2; k <= m; k++) if (s[j][k] != s[j + 1][k - 1]) return ;
}
} else if (x != 2) {
for (register int j = x; j < n; j++) {
for (register int k = y + 3; k <= m; k++) if (s[j][k] != s[j + 1][k - 1]) return ;
}
}
} else {
if (s[x][y] == s[x - 1][y + 1]) {
for (register int j = y + 2; j <= m; j++) if (s[x][j] != s[x + 1][j - 1]) return ;
} else if (x != 2) {
for (register int j = y + 3; j <= m; j++) if (s[x][j] != s[x + 1][j - 1]) return ;
}
}
}
}
for (register node *i = v[X]; i -> x; i++) s[i -> x][i -> y] = 1;
dfs(X - 1);
for (register node *i = v[X]; i -> x; i++) {
s[i -> x][i -> y] = 0;
dfs(X - 1);
}
}
int main() {
scanf("%d%d", &n, &m);
if (n > m) std::swap(n, m);
if (n == 1) {
printf("%d\n", pw(2, m));
return 0;
}
int res = pw(3, m - n - 1);
m = min(n + 1, m); for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) v[i + j][tot[i + j]++] = node(i, j);
}
dfs(n + m);
printf("%lld\n", static_cast<long long> (ans) * res % mod);
return 0;
}

  

[NOIP2018 TG D2T2]填数游戏的更多相关文章

  1. @NOIP2018 - D2T2@ 填数游戏

    目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 ...

  2. 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

    2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...

  3. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

  4. NOIP2018 填数游戏 搜索、DP

    LOJ 感觉这个题十分好玩于是诈尸更博.一年之前的做题心得只有这道题还记得清楚-- 设输入为\(n,m\)时的答案为\(f(n,m)\),首先\(f(n,m)=f(m,n)\)所以接下来默认\(n \ ...

  5. 【题解】NOIP2018 填数游戏

    题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...

  6. luogu P5023 填数游戏

    luogu loj 被这道题送退役了 题是挺有趣的,然而可能讨论比较麻烦,肝了2h 又自闭了,鉴于CSP在即,就只能先写个打表题解了 下面令\(n<m\),首先\(n=1\)时答案为\(2^m\ ...

  7. JZOJ5965【NOIP2018提高组D2T2】填数游戏

    题目 作为NOIP2018的题目,我觉得不需要把题目贴出来了. 大意就是,在一个n∗mn*mn∗m的010101矩阵中,从左上角到右下角的路径中,对于任意的两条,上面的那条小于下面的那条.问满足这样的 ...

  8. NOIP2018 Day2T2 填数游戏

    下面先给出大家都用的打表大法: 首先我们可以发现 \(n \le 3\) 的情况有 \(65pts\),而 \(n\) 这么小,打一下表何乐而不为呢?于是我写了一个爆枚每个位置再 \(check\) ...

  9. UOJ#440. 【NOIP2018】填数游戏 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ440.html 前言 菜鸡选手到省选了才做联赛题. 题解 首先我们分析一下性质: 1. 假如一个格子是 0,那么它的右上角 ...

随机推荐

  1. sftp上传到远程服务器

    开发遇到一个需求,需要将图片通过sftp上传到远程服务器上,之前没用过这个功能,折腾了我好几天才搞定,下面记录下我的处理方法: $sftp = 'ssh2.sftp://';//连接sftp $con ...

  2. php Trait的使用

    1.php中的trait是啥? 看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么:提供模块化实现.Trait是一种代 ...

  3. thinkphp phpmailer邮箱验证

    thinkphp 关于phpmailer的邮箱验证 一  . 登陆自己的邮箱,例如:qq邮箱.登陆qq邮箱在账户设置中开启smtp服务: 之后回发送一个授权码 , 这个授权码先保存下来,这个授权码在后 ...

  4. ScriptManager和UpdatePanel用法 (ajax)

    ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异 步局部更新区域,它必须依赖于ScriptManager存在, ...

  5. R语言绘图:箱线图

    使用ggplot2绘制箱线图 ######*****绘制箱线图代码*****####### data1$学区房 <- factor(data1$school, levels = 0:1, lab ...

  6. C++ vector的reserve和resize详解

    vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!原因如下:      rese ...

  7. 【財務会計】BS科目とは・PL科目とは

    「BS科目」「PL科目」という言葉がありますが.聞いたことあるけどよくわからん!っていう人は多いと思います.なので.簡単にご説明を. BS科目は「いくらあるか」 「BS科目」は.「B/S科目」と書くこ ...

  8. git之解决冲突

    前面几次使用git,一直对于冲突的这个问题不是很理解,感觉有些时候就会产生冲突,在此记录一下解决冲突的流程 1.git bash上面冲突显示 2.在idea上面可以看到冲突的文件 3.去解决冲突 4. ...

  9. P1103 书本整理

    P1103 书本整理 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发现,由 ...

  10. elasticsearch-mathc和term的区分

    elasticsearch和mysql在思想上是有不同的,elasticsearch有分词一说,比如北京奥运分词成北京,奥运,北京奥运.分词要要考虑两点,一个是查询字符串要不要分词,还有就是原存储字段 ...