Prelude

为什么洛谷上的题解都是剪枝做的啊!就没有人写复杂度靠谱的算法吗!

传送到洛谷:( ̄、 ̄)

传送到BZOJ:( ´・・)ノ(._.`)

本篇博客地址:o(><;)oo


Solution

首先\(O(n^6)\),或者是\(O(n^4 \log^2 n)\)的模拟非常好想,枚举锤子的长宽,然后从左上角开始挨个砸就可以了。

枚举的复杂度是\(O(n^2)\)的,模拟一次的复杂度是\(O(n^4)\)的,也可以用BIT做到一次模拟\(O(n^2 \log^2 n)\)。

仔细想了想发现似乎没法合理枚举,那就只能发掘性质了。

直觉告诉我似乎是行列无关的。

具体来说,我们首先固定锤子的长为1,然后枚举锤子的宽,求出当长为1的时候最大可行的宽,叫做\(c\)。

然后再固定锤子的宽为1,枚举锤子的长,求出当宽为1的时候最大可行的长,叫做\(r\)。

上面两步可以用\(O(n^4)\)的暴力模拟来做,或者是用BIT做到\(O(n^3 \log n)\)。

那么这个\(r\)和\(c\)就是最终答案。

试着证明了一下,确实是这样的,具体证明我没有仔细想,大概感觉是从“每个格子被敲打的次数是行列无关的”这条入手?

然后就A掉了。

因为我比较懒,所以写的是\(O(n^4)\)的方法,毕竟这个模拟常数小嘛,\(O(n^4)\)过100肯定没问题啦。


Code

#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std;
const int MAXN = 110;
int _w; int n, m, a[MAXN][MAXN], tot;
int r, c, b[MAXN][MAXN];
int t[MAXN][MAXN]; bool check( int x ) {
for( int i = 1; i <= r; ++i )
for( int j = 1; j <= c; ++j )
t[i][j] = b[i][j];
for( int i = 1; i <= r; ++i )
for( int j = 1; j <= c-x+1; ++j )
for( int k = j+x-1; k >= j; --k )
t[i][k] -= t[i][j];
for( int i = 1; i <= r; ++i )
for( int j = 1; j <= c; ++j )
if( t[i][j] ) return false;
return true;
} void solve() {
r = n, c = m;
for( int i = 1; i <= r; ++i )
for( int j = 1; j <= c; ++j )
b[i][j] = a[i][j];
for( int x = c; x >= 1; --x )
if( check(x) ) {
tot /= x;
break;
}
r = m, c = n;
for( int i = 1; i <= r; ++i )
for( int j = 1; j <= c; ++j )
b[i][j] = a[j][i];
for( int y = c; y >= 1; --y )
if( check(y) ) {
tot /= y;
break;
}
printf( "%d\n", tot );
} int main() {
_w = scanf( "%d%d", &n, &m );
tot = 0;
for( int i = 1; i <= n; ++i )
for( int j = 1; j <= m; ++j ) {
_w = scanf( "%d", &a[i][j] );
tot += a[i][j];
}
solve();
return 0;
}

【题解】打地鼠 SDOI2011 模拟 行列无关的更多相关文章

  1. BZOJ2241 [SDOI2011]打地鼠 【模拟】

    题目 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地 ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. [题解+总结]NOIP2015模拟题2

    // 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总 ...

  4. B2241 打地鼠 暴力模拟

    大水题!!!30分钟AC(算上思考时间),直接模拟就行,加一个判断约数的剪枝,再多加几个剪枝就可以过(数据巨水) 我也就会做暴力的题了. 题干: Description 打地鼠是这样的一个游戏:地面上 ...

  5. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

    猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...

  6. luogu题解P2486[SDOI2011]染色--树链剖分+trick

    题目链接 https://www.luogu.org/problemnew/show/P2486 分析 看上去又是一道强行把序列上问题搬运到树上的裸题,然而分析之后发现并不然... 首先我们考虑如何在 ...

  7. 3403. 题解【NOIP2013模拟】数列变换 (Standard IO)

    先看题目: Description 小X 看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他.考虑数列A=[A1,A2,...,An],定义变换f(A,k)=[A2,A3,,,,.Ak,A1,Ak+2 ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. 【题解】SDOI2011消耗战

    虚树模板题~洛谷P2495 第一次写虚树,感觉好厉害呀~首先,这道题目的树形dp是非常显然的,要控制一个点&其子树所有点,要么在子树内部割边,要么直接切点该点与父亲的连边.所以dp[u]表示控 ...

随机推荐

  1. D.王者荣耀交流协会——PSP Daily(测评人:贾男男)

    D.王者荣耀交流协会——PSP Daily(测评人:贾男男) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品.1.根据(不限于)NABCD评论作品的选题;2.评论作品对 ...

  2. java.util.ConcurrentModificationException: null

    是因为在map.foreach中又put新的值了 在map.foreach中可能是不可以增删改

  3. Daily Scrum4 11.6

    昨天的任务按时完成了,但是通过不到两周的时间,我们的工作依旧停留在修改上届学长代码中.今天上课和老师提出了这样的问题,助教在TFS上重新加载了10级学长的代码. 从上届学长代码那里我们发现,他们没有实 ...

  4. 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实  验  报  告 课程: Java        班级:1352          姓名:黄伟业         学号:20135215 成绩:           ...

  5. C++:友元

    前言:友元对于我来说一直是一个难点,最近看了一些有关友元的课程与博客,故在此将自己的学习收获做一个简单的总结 一.什么是友元 在C++的自定义类中,一个常规的成员函数声明往往意味着: • 该成员函数能 ...

  6. 手机端学习助手的说明书需求以及团队PM选择

    1.产品的背景 课堂上知识容量大.密度高,学生不能立刻掌握所学知识点,同时,网上资料冗杂繁复,指向性不强,导致学生不能高效的学习,为了充分利用学生的课余时间,培养学生自学能力,辅助老师教学,我们小组希 ...

  7. 寒假作业第二篇随笔(A+B)

    Github链接:https://github.com/heihuifei/object-oriented A+B Format (20) Calculate a + b and output the ...

  8. 福大软工1816 · 评分结果 · beta冲刺总评

    作业地址:beta答辩总结.beta冲刺7.beta冲刺6.beta冲刺5.beta冲刺4.beta冲刺3.beta冲刺2.beta冲刺1.beta冲刺前准备 作业提交准则 按时交 - 有分 晚交 - ...

  9. Leetcode题库——16.最接近的三数之和

    @author: ZZQ @software: PyCharm @file: threeSumClosest.py @time: 2018/10/14 20:28 说明:最接近的三数之和. 给定一个包 ...

  10. ubuntu16.04+pycharm+默认文件头注释

    安装 1.sudo gedit /etc/hosts 2.最后一行添加 0.0.0.0 account.jetbrains.com 3.从 http://idea.lanyus.com/ 中获取激活码 ...