常州培训 day4 解题报告
第一题:(简单的模拟题)
给出一个N位二进制数,有‘+’, ‘-’, ‘*’, ‘/’ 操作,分别表示加1,减1,乘2,除以2,给出M个操作,求出M个操作后的二进制数。N,M<=5000000;
数据保证最高位不会进位或退位。
解题过程:
1.一开始以为是裸的高精度,但是数据范围肯定做不到那么大。考虑二进制运算的特殊性,题目又有”数据保证最高位不会进位或退位“,那么二进制数的最高位已经定了,只要做一个尾指针r,如果*就r++,如果除就r--,就是模拟左移右移的过程。
2.考虑到1011111111111111111111111111111的情况,如果+1,那么就要改变很多位,而N又很大,担心超时,于是做了一个累加器cnt,如果碰到‘+’,就cnt++,碰到‘-’就cnt--。碰到‘*'的时候考虑cnt的值,如果比较大(自己设一个边界),那么就先做一次加法(减法),把cnt清0;碰到除法比较恶心,需要考虑2种特殊情况;
A.如果cnt为负奇数,且被减数x为偶数,那么 比如(10-5)/2=2, 就不能简单的把被减数和减数都除以2,因为(10/2-5/2)=3,所以需要多减一个1。
B.如果cnt为正奇数,x是奇数,那么比如 (11+5)/2=8, 就不能简单的把x和cnt都除以2,因为(11/2+5/2)=7,所以需要多加一个1。
这样就不用每次都处理整个数,只有当计数器累积的值比较大的时候才做一次,大大减小了计算次数。
考试的时候处理乘法的时候,边界写错,结果爆0了。。自己写的小数据没能找出错。
3.修改后的代码速度却很不理想,竟然不如最朴素的算法,碰到‘+’就+1,碰到‘-’就-1,碰到‘*'就右移一位,碰到’/'就左移一位。。一开始优化了半天,还是不如人家的朴素算法,最后才发现是 int 和char 速度的区别,用char 表示二进制数速度可以快一倍,不过2中的优化就没法用了。但是相比之下char比int要快的多得多。 简单才是最美额。
另外在考试的时候发现一个非常奇妙的东西,就是对于负数,右移一位不等价于除以2.
(-7)/2=-3;
(-7)>>1=-4;
考试时百思不得其解,搜了些资料
http://www.cnblogs.com/myblesh/articles/2431806.html
大致是 -7 的存储是用补码,也就是11111.......11001;右移一位就变成了111111....11100;转换回来就是10000....100;也就是-4。 以后碰到负数还是老老实实用‘/’吧。。
第二题:
题目大意:给出n*m的棋盘,给出棋盘上k个皇后(可以控制行列和对角线)的坐标,求出没有被控制的点的个数。 N,M<=50000,K<=500;
解题过程:
1.最容易想到的是开一个二维数组,然后依次判断每个点是否被控制,但是空间显然不够。
2.很快能想到可以倒过来做,求出被控制的点的个数,用m*n来减就是答案。用hash数组保存每行每列以及对角线的情况,然后依次加入一个个皇后,对于每一个皇后,沿着行列和对角线走一遍,统计增加的被控制的点即可。复杂度O(nk),常数也比较小;
3.300分的AK大神 上去讲了个思路,挺巧妙的,不过感觉效率可能还不如 2中的方法:从上往下一行行扫描,对于每一个皇后,可以求出它能控制到的这行的那些点,用一个hash并统计被控制的点的个数。。复杂度应该也是(nk),但是常数估计比较大,因为处理完每一行,hash数组都要memset一遍。
4.讲课的大神的方法:把同一行的60个格子压成一个long long,加上hash即可。。不过感觉具体实现起来有些麻烦。
第三题:
题目大意:求出满足相邻数字不超过2的 K位数的个数。 K<=10^18;结果mod 1000000007;
解题过程:
1.这题数据太大了,30%的都是10^6;写了个动规,F[i][j]表示以i结尾的j位数的个数,F[i][j]=sum(F[k][j-1]),(i-2<=k<=i+2,0<=k<=9);
怕超时,把递推改成记忆化了,结果爆栈,只骗到了一个k=1的数据。
2.正解思路基本也是这样,不过要用矩阵乘法优化;参考国家集训队论文,现学了点矩阵乘法的东西。
只在yzoi上写了个矩阵乘法版斐波那契,算是勉强入门了。
再来看这题,首先根据递推公式,发现 F[i][j]只和F[i-2...i+2][j] 有关,因此构造这样一个矩阵:
1 1 1 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 1 1 1
初始矩阵为 0 1 1 1 1 1 1 1 1 1
分别表示以i开头长度为1的 方案数。利用结合律先让 第一个矩阵自乘n-2次,再和第二个矩阵乘一次 即为答案。
常州培训 day4 解题报告的更多相关文章
- 常州培训 day5 解题报告
第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...
- 常州培训 day7 解题报告
最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元 n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...
- 常州培训 day6 解题报告
第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...
- 常州培训 day3 解题报告
第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多 ...
- 常州培训 day2 解题报告
第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大 ...
- 常州培训 day1 解题报告
第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
随机推荐
- Python学习(18)面向对象
目录 Python 面向对象 创建实例对象 Python内置类属性 Pyyhon对象销毁(垃圾回收) 类属性与方法 Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此 ...
- 在 Windows XP 下查看所有卷标信息
http://support.hp.com/cn-zh/document/c01270024 点击“开始”,在“开始搜索”中输入:diskpart,然后按键盘“回车”键. 在“命令行窗口”中,等待“D ...
- 第一天……
Hello,大家好! 不对,这个开头有点不对.我不应该这么说,这个博客我是为我自己而开通的.目的很简单,好记兴不如烂笔头,把每天所学所感写下来. 我想作一个有条理的人,一个有计划的人,一个有效率的人. ...
- PHP 链式操作
所谓链式操作最简单的理解就是 操作完毕之后再返回对象$this 想必大家工作中基本都快用烂了得东西. 下面就是一个链式操作MYSQL数据库类. 最常见的链式操作 每一个方法操作之后,返回一个对象,直到 ...
- nexus 2.6需要jdk7才能跑起来
Java 6 Support EOLOracle's support for Java 6 ended in February 2013. Consequentially as of version ...
- spring @ExceptionHandler注解方式实现异常统一处理
首先,在我们的工程中新建BaseController父类,内容如下: package com.ztesoft.zsmartcity.framework.exception; import java.i ...
- return 还是 不return
jQuery.fn.functiona = function() { //return this.each(function() { **** } jQuery(this).css('backgrou ...
- $.extend abc
console.log(jQuery.extend(this,{'a':'b'},{'c':'d'}));console.log(this.a)var tt = jQuery.extend({},{' ...
- js encodeURI方法认识
很早就知道js中encodeURI方法,也很早就用过,但是每次看到它总感觉有些陌生,因为不知道到底是什么原理,和普通的编码到底什么关系, 今天在查看w3c api时又遇到了她,正好有空就多看了几眼,突 ...
- PC-1500的代码存入WAV文件
目录 第1章保存 1 1.1 操作 1 1.2 波形说明 4 1.3 波形整形 5 1.4 压缩 8 第2章载入 9 2.1 操作 9 2.2 音量 9 ...