C++11 thread库
摘要:
线程库的基本使用 创建线程 需要一个可调用的函数或者函数对象,作为线程入口。C++11中可以使用函数指针,函数对象或者lambda表达式实现,基本语法如下 #include <thread> std::thread t(function_name, args...); function_name是线
C2280 尝试引用已删除的函数
摘要:
ostream istream等基类为保护类型,是不可以拷贝构造的,所以我们可以使函数返回此基类的引用 代码示例 ostream& operator<<(ostream& out, MyInteger& myint) { out << myint.m_Num; return out; }
背包问题
摘要:
01背包 01背包模型 有一个容量为V的背包。商店有n个物品,每个物品有一个价值v与体积w,一个物品只能拿一次,问可以装下物品的最大价值。 有两个状态,拿或者不拿,用搜索要2^n种。 设状态dp[i][j]表示到第i个物品为止,拿的物品总体积为j的情况下的最大价值。我们不关心某个物品有没有被拿,只关
动态规划
摘要:
动态规划基础 线性DP DP(动态规划) 全称Dynamic Programming,将复杂问题分解为重叠子问题(与[[DFS]]不同),并通过子问题的解得到整个问题的解的算法。 状态 形如dp[i][j] = val的取值,其中i,j为下标,也是用于描述,确定状态所需的变量,val为状态值。 状态
DFS-深度优先搜索
摘要:
回溯法简介 回溯法一般使用DFS(深度优先搜索)实现,DFS是一种遍历或搜索图,树或图像等数据结构的算法。上述数据结构不保存下来就是回溯法。 常见的是搜索树,排列型搜索树(节点数一般为n!)与子集型搜索树(节点数一般为2n)。 DFS从起始点开始,沿着一条路尽可能深入,直到无法继续回溯到上一节点为止
位运算
摘要:
对二进制中的每一位进行逻辑操作,而不考虑整个数的数值大小 与位运算有关的特殊数据结构如[[树状数组]]或[[01线性基]] 一般对正整数进行运算 x >>= 1与x >> 1前者修改了x,后者仅做判断。 使用位运算时尽量使用unsigned int类型,抛弃符号位。 几种位运算 按位与AND & 只
RMQ
摘要:
#include <bits/stdc++.h> using namespace std; #define int long long char* p1, * p2, buf[100000]; #define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,1000
快速幂
摘要:
O(logan)的时间复杂度 代码示例 #include <bits/stdc++.h> using namespace std; #define int long long #define mod 998244353 int a, b; int ksm(int a, int b) { int re
二分答案
摘要:
二分法简介 为一高效查找方法,将搜索范围一分为二。 适用于有序数据集合,利用单调性减少不必要的枚举。 解题步骤 研究数据结构的单调性。 确定最大区间[L,R],确保分界点一定在里头,若以R为答案,区间为[L+1,R](若为0到n,则L=-1,R=n),若以L为答案,答案区间为[L,R-1](同理)。
快慢指针
摘要:
快慢指针 指两个指针从同一侧开始遍历序列,且移动步长一个快一个慢,快的为快指针,慢的为慢指针。称快指针为r,慢指针为l,构成区间[l,r]。直到满足某些条件时为止。 求解步骤 l一般为1,r一般为0,即初始区间为[1,0],表示空区间。 满足一定条件时慢指针右移,满足另一条件时快指针右移,保证区间合