第一题:(简单的模拟题)

给出一个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

http://wenku.baidu.com/link?url=q5qwUdt9n7VYZVVd_IyxaxuA0XXgMS__KGmx-e__0Eym8yXI1jDcrcnJO3Ac_AUvTyNLaPh-4eUkABIFTmfh1KRdSWsBE1kEJHLCkJU2oRe

大致是 -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.正解思路基本也是这样,不过要用矩阵乘法优化;参考国家集训队论文,现学了点矩阵乘法的东西。

http://wenku.baidu.com/link?url=baFXefgWWbuE53GG3ET9Uk9XCNFsmsbOBAE-DrgWS0ahGjMKyJDVyCNBwlD_7ApyoGPVzCodMPrFPS0STyYXmGLK0iRoNZVsSbqqhzdyXWi

只在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 解题报告的更多相关文章

  1. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  2. 常州培训 day7 解题报告

    最后一天..有些感慨,这七天被虐的感动万分 第一题: 题目大意: 求出 n*i(i=1,2,3....n) mod p的逆元  n<p<=3000000 ,p是质数. 之前写过了,懒得再写 ...

  3. 常州培训 day6 解题报告

    第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1, ...

  4. 常州培训 day3 解题报告

    第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多 ...

  5. 常州培训 day2 解题报告

    第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大 ...

  6. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  7. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  8. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  9. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

随机推荐

  1. Android通过webservice对sqlserver数据库进行操作

    首页在AndroidManifest.xml中添加访问数据库权限 <uses-sdk android:minSdkVersion="7" /> <uses-per ...

  2. SVM(支持向量机)与统计机器学习 & 也说一下KNN算法

    因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...

  3. hdu 1575 Tr A(矩阵快速幂)

    今天做的第二道矩阵快速幂题,因为是初次接触,各种奇葩错误整整调试了一下午.废话不说,入正题.该题应该属于矩阵快速幂的裸题了吧,知道快速幂原理(二进制迭代法,非递归版)后,剩下的只是处理矩阵乘法的功夫了 ...

  4. DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)

    DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...

  5. shell脚本中获取本机ip地址的方法

    ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...

  6. python操作mongodb之四cp数据库

    from pymongo import MongoClient #连接数据库 client=MongoClient('192.168.30.252',27017) #获取现有数据库的名称 client ...

  7. Java中的泛型方法

    泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...

  8. struts2 I18N 国际化

    1. 准备properties文件 globalMessages_en_US.properties globalMessages_zh_CN.properties 2. 配置struts.xml &l ...

  9. The Network Adapter could not establish the connection问题研究

    最近一个项目会报上述错误,但也不是经常发生,所以很难跟踪,影响不是很大,但每次看到日志中这个错误就会不舒服,还是要想办法解决才是. 错误提示信息很明确是网络适配器不能创建连接. 查了很多资料,并且Or ...

  10. Office 多版本共存

    1 32位共存 假如已经安装了Office 2003(必定是32位的),那么安装 32位Office 2010 时会出现如下错误: 图1.1 解决办法: 1.将下述三个注册表项导出到文件2003A.r ...