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. 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错

    问题描述: 今天在使用HQL的按照参数的名字查询数据库信息的时候报错如下: org.hibernate.QueryException: Space is not allowed after param ...

  2. 剑指offer--面试题7

    //两个栈实现一个队列 #include<stack> //STL #include<iostream> using namespace std; template<cl ...

  3. 坑人的 try catch finally

    一直以为这样可以关闭 fs, 其实不行 static void Main(string[] args) { FileStream fs = null; try { fs = new FileStrea ...

  4. SSL 握手过程

    SSL协议的握手过程 SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术.SSL 的握手协议非常有效的让客户和服务器 ...

  5. 【C++基础】构造函数

    说说你对构造函数的理解? 构造函数:对象创建时,利用特定的值构造对象(不是构造类),将对象初始化(保证数据成员有初始值),是类的一个public 函数 ①   与类同名 ②   无返回值 ③   声明 ...

  6. UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)

    题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 此 ...

  7. ubuntu安装hadoop2.6

    一:单机版 1.sudo gedit ~/.bashrc 加入JDK路径 #HADOOP VARIABLES START export JAVA_HOME=/usr/lib/jvm/java-1.7. ...

  8. 乳草的入侵//BFS

    P1030 乳草的入侵 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美 ...

  9. leetcode:两个数的和||

    两个数的和|| 给定一个排序数组,求出其中两个数的和等于指定target时,这两个数在原始数组中的下标,返回的下标从1开始 解题 原始数组已经是升序的,找出其中两个数的和等于target 定义两个指针 ...

  10. 使用PowerDesigner进行数据库建模入门

    阅读目录 两种重要模型 创建表和主外键 创建视图和存储过程 生成数据库 PowerDesigner(简称PD)是一种强大的数据库建模工具,使用PD可以创建业务模型,UML类图等,当然最主要的功能是数据 ...