- 进行除法,向下取整对判断是否有影响,(上取整
)
- 进行
,是否影响循环结束,错过部分代码运行
- 只要不是下标,变量全为
,用下标进行运算时转换格式为
- 给定值的大小关系是否明确
- 并查集缩点时,不能边缩点边建边
- 自定义排序,注意多元组等于时顺序是否有影响
- 求
,可以考虑用集合存数组中缺少的数,由于结果一定小于
,所以集合大小不会超过
的数量级
- 带有绝对值的式子,求最小,排序后会前后相消只留下首尾
- 取模,保证每一步都要模,若做减法要补模数
可以得到满足或条件的
到1e6要改线程防止爆栈
- 正着不好进行决策考虑倒着,一般是在倒着决策的情况下可以将问题转为前面剩下部分的子问题
- 乘法运算,可以考虑转为累加
- 当数据很大但是总共为n个且是离散的,可以考虑离散化,例如区间端点
- 当要枚举区间端点才能得到结果时,看能否通过移项使等式一端只跟区间左端点或右端点有关,之后放入set,查表有一样的则满足等式,例:
- 对于数学问题,可以试着枚举下数看能不能缩小范围
- 先想暴力,不要上来找规律,关注数据范围很小的变量
- 具有周期性质,考虑
- 先考虑特殊情况,某些值为0,考虑简单版的题目,然后再考虑不为0的情况
- 对于决策存在一个最优的顺序,但数据很小,可以用状压枚举所有顺序,最优一定包含
- 进行
后要看是否答案有顺序要求,记得还原
- 对于数组有删除插入,知道数组最大长度,用链表模拟,链表上无法二分,只能从头扫到目标点
按
升序排序,而不是value,自定义也是对
- 去重不影响结果,用
,替代
防超时,
- 当询问很小直接做,询问很多考虑离线
- 累加不好处理,考虑从总和删去多余的数
- 操作相互抵消,考虑异或打标记传递,每次操作只向最近的影响点做标记,到了再向下传标记(如果还未被抵消)
- 对于矩阵上扫描,若一个点的状态会被更优的覆盖,则不用dfs,而用类Spfa bfs,保证当前进行决策的点是该点目前的最优状态,避免无效递归(再被更优的覆盖)
- 异或看作不进位加法,比较异或后大小,看两个数中较小数的最高位在较大数相应位的值,若为1,则变小,若为0,则变大
- 统计贡献时,异或操作各位之间无影响,可以对于每一位单独进行操作,看作数组值全为0/1
- 区间问题,看作拆为以x-1结尾的和以x+1开头的,拼接成包含x的区间
- 区间算贡献,对每个点进行考虑,计算有多少区间包含该点
- 回文串的判断也可以通过hash判断从左往右和从右往左是否相同
- Hash底数取29,131,模数取1e9+7,1e9+9
- 数组创建也需要时间,开1e7要超时,考虑将不需要的记录滚掉
- 负数除法会上取整
- 𝑎=𝑏 的要求一个想法就是:是不是 𝑎+𝑏 为定值
- 主席树不带修改查询第k小
- c++中long long 必须是两个long long 相加
- 在main中的数组要用memset赋初值
- (long long)1<<j
- x=k1*a1+k2*a2+k3+a3+……,判断有解,即x为gcd(a1,a2,a3……)的倍数
- 区间[l,r]异或和等于区间[0,l-1]^[0,r]
对于任何一个位数大于1的数,必有 𝐷(𝑛)<𝑛 (想想十进制是怎么表示数的)
而对于位数为1的数,有 𝐷(𝑛)=𝑛
所以只要有一个进位,就相当于一个位数为1的数变成位数大于1的数,则 𝐷(𝑘𝑛) 一定小于- ()括号字符串,将(=1,)=-1,前缀和后
如果反转区间 [l,r][𝑙,𝑟],那么前缀会受到影响的位置就是 k∈[l,r]𝑘∈[𝑙,𝑟],下标为 k𝑘 的前缀会变成 𝑠𝑙−1−(𝑠𝑘−𝑠𝑙−1)=2⋅𝑠𝑙−1−𝑠𝑘
反转区间内的(
和)
的数量必须相同,因此合法的右端点 k∈[l,r]𝑘∈[𝑙,𝑟] 还需要满足𝑠𝑘−𝑠𝑙−1=0 - 递归记忆化,若知道下一跳是谁,可以改为先得出当前一步的结果,再倒着for一遍由小累加处理 题目
- 组合数C(x+1,k)=C(x,k)+C(x,k-1),可以递推
- 字符串公共前缀,字典树
- 鸽巢原理,不同颜色两两配对,可以单个为一组,由小到大排序,当前组数为max(a[i],(sum+1)/2),去最长的为巢,其余往里放
- n*n矩阵上,曼哈顿距离,找齐所用可能的距离,取对角线上的(n-2)个点,和(n-1,n),(n,n),偶数距离为到(n,n)基数距离为到(n-1,n)
- 连通块,一加一减,黑白染色,dfs判断合法(访问到一个访问过的染色不冲突)
- 求最大值,可以将当前求得的最大值,作为下一次查找的下界,减少查找次数
- 树的重心,如果在树中选择某个节点并删除,这棵树将分为若干棵子树,统计子树节点数并记录最大值。取遍树上所有节点,使此最大值取到最小的节点被称为整个树的重心。树中所有点到某个点的距离和中,到重心的距离和是最小的。以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。所以i,i+n/2一定在两棵子树中
- &|xor,二进制运算,求2^l到2^r中合法方案,前缀和相减
- 三角剖分,多边形有n个点,则最多划分出n-2个三角形
- 树的直径,先dfs找的最远的点,在以其为根dfs找最远的点
- 大数gcd,较大数对较小数一直做除法,若较大数为长度较大,用string读入
for(int i=0;i<a.size();++i){ i64 x=a[i]-'0'; A*=10; A+=x; A%=B; }
- double结果输出用printf("%.10f",ans2 );
- 调用max,min,abs等数学运算,加std::快很多
- 正难则反,考虑总情况减去,用差得出结果
问题注意QWQ
于 2024-03-13 00:02:55 首次发布