two

模拟

大意:给你一个 N 位二进制数,有四种操作:加1、减1、乘2、整除2。给定一个操作序列,求最终结果。N <= 5*10^6。数据保证不会在最高位上进行进位或退位操作。

初步解法:由于题目中的特殊限制(操作不影响最高位),我们可以直接用一个 char 数组和一个尾指针来进行操作。「加1」操作即从最后一位往前找连续的 1 并将其改成 0,然后将遇到的第一个 0 改成 1,并结束循环。「减1」操作类似,找连续的 0 并将其改成 1,将遇到的第一个 1 改成 0。「乘2」操作即在末尾添加一个 0,「除2」操作即删去末尾一位。有两个很明显的优化:如果「加1」操作后面紧跟「减1」操作就直接跳过这两个操作;「乘2」与「除2」相连时同理。要注意的是如果「除2」后面跟的是「乘2」,那么得到的结果不一定等于原数(想一想,为什么?)。

这样的算法最坏情况下时间复杂度为 O(N^2),最多拿 60 分。不过由于最近 RP 爆发,用这种方法还是轻松 AC 了。

正解:将加减操作不断累加到一个计数器中。若遇到乘则原数与累加器都乘以2,若遇到除则清空累加器,将其向前进位。

还有一种更好玩的算法是,将连续的 0 和 1 缩在一起,如 100011001 可以表示为 (1, 1), (0, 3), (1, 2), (0, 2), (1, 1),那么对应的操作就会变得非常简单,不再赘述。

 

chess

哈希表

大意:在棋盘上放置若干个皇后,要求输出最终棋盘上不会被攻击到的格子数。

正解:我们知道,每次在棋盘上放置一个皇后都(可能)会使安全格子数减少,所以我们只需不断减去被攻击的格子数即可。

如何计算被攻击的格子数?为了方便我们先不考虑对角线。每次放入一个皇后,如果该行已经被其他皇后控制(用一个哈希表判断),那么不需要处理,否则就改变哈希表中的值并累加 cnt_of_row (被控制的行数);对于列就可以用另一个哈希表作类似处理。处理完所有皇后我们就能知道有哪些行、哪些列已经被控制,那么被控制的总格子数为 cnt_of_row * num_of_col + cnt_of_col*num_of_row – num_of_row*num_of_col(一个简单的容斥原理:被控制的行数乘以每行的格子数加上被控制的列数乘以每列的格子数减去被重复计算的格子数)。

然后考虑对角线上的控制。对角线有两种方向(主对角线与次对角线),可以设两个哈希数组。对于每个皇后所在的两条对角线,我们可以计算出其对角线覆盖的范围,对于其覆盖范围的每个点,判断其行与列是否已经被控制:如果已经被控制,那么不必累加;否则就将被控制格子数加一。

 

sam

递推

详见我的另一篇文章:《用矩阵乘法优化递推》。

省常中模拟 Test2 Day2的更多相关文章

  1. 省常中模拟 Test3 Day2

    matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...

  2. 省常中模拟 day2

    第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...

  3. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  4. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  5. 省常中模拟 Test3 Day1

    tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...

  6. 省常中模拟 Test1 Day1

    临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...

  7. CH Round #55 - Streaming #6 (NOIP模拟赛day2)

    A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...

  8. 如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?

    1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数. ...

  9. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

随机推荐

  1. HDU 2821 Pusher

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关 ...

  2. 【BZOJ】【1927】【SDOI2010】星际竞速

    网络流/费用流 比较简单的一题,对于每个星球,将它拆成两个点,然后二分图建模:左部结点与S相连,流量为1费用为0:右部结点与T相连,流量为1费用为0:对于每条航道x->y,连边x->y+n ...

  3. Java多线程——<一>概述、定义任务

    一.概述 为什么使用线程?从c开始,任何一门高级语言的默认执行顺序是“按照编写的代码的顺序执行”,日常开发过程中写的业务逻辑,但凡不涉及并发的,都是让一个任务顺序执行以确保得到想要的结果.但是,当你的 ...

  4. 基于jQuery的TreeGrid组件详解

    一.TreeGrid组件相关的类 1.TreeGrid(_config) _config:json格式的数据,组件所需要的数据都通过该参数提供. 2.TreeGridItem(_root, _rowI ...

  5. 微软发布WP SDK8.0 新增语音、应用内支付等原生API

    http://www.csdn.net/article/2012-10-31/2811338-windows-phone-8-sdk 京时间10月30日,微软在旧金山举行新一代手机操作系统Window ...

  6. OneAPM 技术公开课第二讲:开启性能为王的架构时代

    「OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点.继北京站第一场火爆上演之后,第二场将于9月1 ...

  7. CentOS下使用cmake编译安装mysql

    一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...

  8. How does database indexing work?

    When data is stored on disk based storage devices, it is stored as blocks of data. These blocks are ...

  9. Namespace, string, vector and array

    1. Headers should not include using declaration Code inside headers ordinarily should not include us ...

  10. .net中的认证(authentication)与授权(authorization)

    “认证”与“授权”是几乎所有系统中都会涉及的概念,通俗点讲: 1.认证(authentication) 就是 "判断用户有没有登录?",好比windows系统,没登录就无法使用(不 ...