刷题总结
CF1918B Deja Vu
一个数如果能被$ 2^i $整除,那么加上\(2^{i-1}\)后将不会被\(2^{i+k}\)整除(k>=0)。
CF1883B Chemistry
回文数判断(不考虑各数之间顺序)
将数转换为字符串,字符串中出现字符为奇数的不能大于1。
CF1849 Monsters
- 如果用sort排序想保证相同元素按原先的位置排序,那么就可以用std::stable_sort时间复杂度为\(O(nlogn)\).
- 可以使用iota函数生成快速递增序列。详细
CF1878B Hamon Odyssey
&为位和运算
- 性质
- a&b<=a+b;(当a,b都为0时取等)
- 初始化为INT_MAX在进行&运算不会改变本身。
CF1842 Tenzing and Books
|为位或运算
- 性质
- 如果x|a=x,那么a的二进制下为0的位置x也为0.
那么可以推出一个数n想通过|运算(a1...an)那么(a1...an)同时也要满足ai|x=x.
- 如果x|a=x,那么a的二进制下为0的位置x也为0.
CF1907D Jumping Through Segments
- 经典二分.
- 由于答案只要满足在一个区间内,那么我们也构造一个区间来验证每一步的可行性。
- 设左端点为ll=0,右端点为rr=0.
那么左端点就为题目左端点和目前(左端点-步数)的最大值。 - 为什么要求的是最大值呢?
因为我们在要到新的一个区间的时候,左端点只能在当前区间的左端点(即使可以走的更左一点)。右端点同理。
- 设左端点为ll=0,右端点为rr=0.
CF1954C Long Multiplication
一道简单的数学推导。
- 初中就学过的两个数合相同时,两个数越接近其乘积越大。
对于两个数只能在相同位上交换的条件让两个数比较接近。
- 只要确定其中两个数的最高位(如果相同便往后延续)谁大,再往后对照每一位,将每一位较大的数字与最高位大的数字不在同一个数上就能使两个数最接近了
[校赛]
位运算性质
- 一个数异或两次等于本身。
CF1971G XOUR
map排序
题意简单理解就是把数组中的数分组再排序。
由于数据范围1~1e9,没法直接遍历,肯定需要用到map。
那如何实现分组排序呢。
优先队列
对于map的值的数据类型直接采用优先队列,就能做到键值分组,值排序。
优先队列排序默认是从大到小,那如何从小到大排序呢?
在输入数据时添上负号,再push,输出时再转换回去就完美解决了。