目录
常见思维题类型
排序
区间问题
01串串
字符串串
位运算
gcd 与 lcm
质数相关
二元组
常见思维题类型
思维题很多都可以说是贪心、但贪心种类很多,具体怎么贪,重要的还是在于积累经验吧...有些东西也很难总结,以下算是我的碎碎念....
思维题需要你去找到题目的提示信息,找到数据的特性,然后通过这些特性去推导可能的方法。
从特例入手,去推导一般,多尝试,多画图
排序
按大小排序、erase排序去重、按余数排序、按结构体排序、排序后反排序、优先队列、set
更多在于技巧吧...
区间问题
包含某个连续区间的个数 == (区间左侧元素个数 + 1) * (区间右侧元素个数 + 1)
一个数组的全部连续子区间和 → 算出每个数重复几次加和 → 每个数的权重 = (左边个数+1) * (右边个数+1)
01串串
区间翻转(翻转次数奇偶)、非递增子序列(0或1的特定位置)、双指针、动态维护、0或1个数前缀和、单调性、二分答案.....
bitset、cnt计数器、位运算
字符串串
查找、转化、移动...
bitset<52>
if ( find() == string::npos ){ }
map<string,int>mp mp[x]++
set存放对应字母位置,通过多个set的迭代器改动实现字母交换位置
位运算
‘ & ’、‘ | ’、‘ ^ ’
对于位与操作(&)
与上的越多越容易变小,0 & 任何数 == 0
对于位或操作(|)
或上的越多越容易大
对于异或操作(^)
a ^ b 与( a & b 或 a | b )的比较入手、线性基、Trie树...
二进制形式、bitset
左移快速取2的幂(1<<32 == )、右移快速除2的幂(45>>2 == 45 / 4)
快速幂
取一个数的最低位——lowbit( x ) == x & -x
gcd 与 lcm
gcd(a,b) == gcd(b,a%b)
gcd(a,b) == gcd(a - b,b)
gcd(a + k,b + k) == gcd(a,b - a)
gcd(a,b) == 1,a 与 b 互质
lcm(a,b) == a * b / gcd(a,b)
lcm(a,b)* gcd(a,b) == a * b
质数相关
唯一分解定理、2是唯一偶质因数、埃氏筛、欧拉筛(判断以及统计每个数的最小质因数)
二元组
双指针、计数
map<int,int>mp ans += mp[x]++
数组内两两求差的绝对值→排序后 → 组中的每一个数都要被他后边的所有数减
sum += ( 第 i 位后边的所有数的和 ) - 第 i 位 *( 第 i 位后边数的个数 )