省常中模拟 Test2 Day2
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的更多相关文章
- 省常中模拟 Test3 Day2
matrix 找规律 题意:给定一个 N*N 的只有 0 和 1 的矩阵,有 Q 个操作,分三种:1. 将某行上的所有数字取反:2. 将某列上的所有数字取反:3. 输出 sum{ a[i][j]*a[ ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- 省常中模拟 Test4
prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...
- 省常中模拟 Test3 Day1
tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...
- 省常中模拟 Test1 Day1
临洮巨人 排序 题意:在字符串中找出 A.B.C 三个字母出现次数相同的区间个数. 初步的解法是前缀和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 A.B.C 多 ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)
A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...
- 如何在C#中模拟C++的联合(Union)?[C#, C++] How To Simulate C++ Union In C#?
1 什么是联合? 联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的.每个数据成员都在相同的内存地址开始.分配给联合的存储区数量是“要包含它最大的数据成员”所需的内存数. ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
随机推荐
- 【BZOJ】【2693】JZPTAB
莫比乌斯反演 PoPoQQQ讲义第5题,是BZOJ 2154的升级版(多次询问) 题解:http://blog.csdn.net/popoqqq/article/details/42078725 WA ...
- 20160730noip模拟赛zld
codeforces394E 如果没有在凸多边形内一点的限制,答案肯定是 如果不在凸多边形内,那么目标点肯定在凸多边形边上,我们枚举每条边,在每条边上求出距离平方和最小的点,在这些点中求出最小的 我们 ...
- linux源码阅读笔记 asm函数
在linux源码中经常遇到__asm__函数.它其实是函数asm的宏定义 #define __asm__ asm,asm函数让系统执行汇编语句. __asm__常常与__volatile__一起出现. ...
- hdu 1271 整数对
看了别人的解题报告a了, 大致思路就是 A=a+b*10^k+c*10^(k+1) B=a+c*10^k (在A中取出一位数后) N=A+B=2*a+b*10^k+11*c*10^k 这样就好做了,再 ...
- http://www.oschina.net/translate/elasticsearch-getting-started?cmp
http://www.oschina.net/translate/elasticsearch-getting-started?cmp
- 深入浅出Java并发包—指令重排序
前面大致提到了JDK中的一些个原子类,也提到原子类是并发的基础,更提到所谓的线程安全,其实这些类或者并发包中的这么一些类,都是为了保证系统在运行时是线程安全的,那到底怎么样才算是线程安全呢? Java ...
- 模拟在table中移动鼠标,高亮显示鼠标所在行
在项目中有这样一个需求,在table中移动鼠标时,鼠标所在行高亮显示,其他行正常显示,为此做了一个模拟. 具体代码如下: <!DOCTYPE html> <html xmlns=&q ...
- highcharts 结合phantomjs纯后台生成图片系列二之php2
上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合 ...
- opencv求取RGB分量
需要注意的是下面r,b,g的类型和顺序 须用IPL_DEPTH_8U类型创建图像且[0][1][2]分量分别是b,g,r. 另外多谢郑乾师兄帮我发现了IPL_DEPTH_8U问题 uchar r,b, ...
- asp.net Twilio
Imports System.Net Imports System.Text Imports Twilio Public Class clsTwilioSMS Public Shared Functi ...