开始训练的第一天,重新了解了位运算,枚举,模拟。看的较为仔细的应该是位运算了,其他的有部分题目还未掌握,接下来会更加认真的。
**位运算**:其中比较重要的,常用的应该是逻辑运算符了,按位与,或,非,异或,还有常用的左移,右移。这些运算符的基础都是机器语言,所以都基于二进制。
与:全一则一,有零则零。
或:有一则一,全零则零。
异或:同则为零,异则为一。
左移:左移一位扩大两倍,n<<1=2*n。
右移:右移一位缩小两倍,n>>1=n/2。(向下取整)
应用:a的b次方对p取模;a乘b对p取模
处理方法:1.每个整数可唯一表示为若干指数不重复的2的次幂的和;
2.b&1可以取出b的最后一位,b>>1舍去最后一位;
3.数值过大防止溢出,每次%p;
4.a*b%p时还可以利用a*b%p=a*b-(a*b/p)*p;
**二进制的状态压缩**:常用于写dp中的状态转移方程,降低时间复杂度
应用:最短的Hamilon路径(补充不漏恰好经过每一个点)
处理方法:朴素算法,也可以理解为暴力(其中利用状态压缩优化时间复杂度);
基于二进制,每一个值的状态都有0和1两种,这两种状态分别表示是否经过;
**Lowbit运算**:lowbit(n)=n&(~n+1)=n&(-n);
应用:常用于树状数组。
**枚举**:可以理解为暴力,但在数据量大的情况下,也要有一些技巧。一般枚举和循环,递推,递归,DFS,BFS分不开,有时可能也会用到位运算。
多项式:循环,递推
指数:递归,位运算
排列:递归,next_permutation
组合:递归,剪枝
应用:费解的开关
处理方法:DFS枚举,同时也可加入位运算的处理
遍历第一行的状态,从而固定当前状态,通过改变下一行的状态改变当前行,依次进行,最后通过最后一行的状态判断能否完成
**前缀和**:通过两个和做差的形式得到一个区间和,二维数组里也有类似的处理,线段树和树状数组里有此应用。
上面是昨天学习的大致内容,虽然都是学过的知识,但是看一些题的时候还是感到有些吃力,还是知识点不熟悉,处理方法不清晰,还有很大的提升空间。
昨晚上的比赛的漏洞,首先读题速度还是太慢,有思路之后代码处理太慢,有很多知识点漏洞,见到一个题后不能立即想出基本的处理方法,DFS还是不熟悉,题意读错是大忌。
08-11
09-24