常州培训 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 ...
随机推荐
- Android通过webservice对sqlserver数据库进行操作
首页在AndroidManifest.xml中添加访问数据库权限 <uses-sdk android:minSdkVersion="7" /> <uses-per ...
- SVM(支持向量机)与统计机器学习 & 也说一下KNN算法
因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...
- hdu 1575 Tr A(矩阵快速幂)
今天做的第二道矩阵快速幂题,因为是初次接触,各种奇葩错误整整调试了一下午.废话不说,入正题.该题应该属于矩阵快速幂的裸题了吧,知道快速幂原理(二进制迭代法,非递归版)后,剩下的只是处理矩阵乘法的功夫了 ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- shell脚本中获取本机ip地址的方法
ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...
- python操作mongodb之四cp数据库
from pymongo import MongoClient #连接数据库 client=MongoClient('192.168.30.252',27017) #获取现有数据库的名称 client ...
- Java中的泛型方法
泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...
- struts2 I18N 国际化
1. 准备properties文件 globalMessages_en_US.properties globalMessages_zh_CN.properties 2. 配置struts.xml &l ...
- The Network Adapter could not establish the connection问题研究
最近一个项目会报上述错误,但也不是经常发生,所以很难跟踪,影响不是很大,但每次看到日志中这个错误就会不舒服,还是要想办法解决才是. 错误提示信息很明确是网络适配器不能创建连接. 查了很多资料,并且Or ...
- Office 多版本共存
1 32位共存 假如已经安装了Office 2003(必定是32位的),那么安装 32位Office 2010 时会出现如下错误: 图1.1 解决办法: 1.将下述三个注册表项导出到文件2003A.r ...