书上内容
-
priority_queue 是堆
(重写priority_queue的比较方法) -
判断是否有二分图
- dfs,用
vector<int> G[V]
存每个点的邻接点,对所有点dfs,每次dfs先染色该点,然后遍历当前点的所有邻接点,1.如果相同颜色则没有二分图return false
2.如果没有染色则return
对该点能否dfs另一种颜色 3.全部遍历完则说明符合条件,return true
-
dp动态规划的本质是带记忆的dfs(记忆化搜索)
做题知识点
-
RE:数组开太小了;读入的时候有问题;
-
数组的引用。用模板时传递的数组必须用常数初始化
template<int N>
void f(int (&a)[N]){
...
}
int main(){
int m = 2;
int a[m] = {..};
f(a) //×
int a[2] = {..};
f(a) //√
}
-
使用scanf和cin读取字符串的时候遇到空格会当作两部分分别读取,要想读取一行需要使用
gets(char[])
(以换行符结尾,前面记得加一次getchar()抵消掉一次换行读取) -
int是
2^31-1
,爆int的用long long -
各种有用的函数
<algorithm>
:
-sort(fisrt, last)
适合数组,vector
- 可以写一个bool cmp()
函数(默认小于比较)传递给sort(s,s+n,cmp)
, 或者重写小于号
-min(a, b)
max(a, b)
-next_permutation(first, last)
<numeric>
:accumulate(first, last, init)
有返回值
<climits>
INT_MAX
(注意有加法操作时可能会爆int,最好设INF=999999999(9个9))- INF也可以设置成
1<<30
(1左移30位,230)或(1<<31) -1
(INT_MAX)
<cmath>
ceil()
floor()
int myints[] = {1,2,3};
do {
std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
} while ( std::next_permutation(myints,myints+3) );
-
codeblocks必须要project才能debug
-
二维字符串矩阵读取
s[n][m];
for (int i = 0; i < n; i++) {
scanf("%s", &s[i]);
}
-
struct也要写构造函数
-
数据范围
假设时间限制为一秒时间复杂度(把n最大值代入) 1e6 游刃有余 1e7 勉勉强强 1e8 很悬
int:-231~231 ≈ 10^9…
-
多组数据数组初始化
<cstring>
memset(s, val, sizeof(s))
填充char数组,对于int数组只能初始化为0或-1
<algorithm>
fill(s, s+n, val)
可以初始化成任何数,适用于int数组、vector、char数组 -
数组越界!真的坑。移动点的时候检测目标点会不会越界
-
判断整数序列是否重复的时候可以构造出对应的整数,然后利用bool数组(开的足够大,利用
seq= 1; seq= seq* 10 + digit
构造整数)
if(isans[seq] == false){
isans[seq] = true;
ans++;
}
得到不重复的序列个数
- 重写priority_queue的比较方法:1
(1)重写小于号
(2)在建立的时候传递cmp
对象
struct cmp{
bool operator()( T &t1, T &t2)
{
if(t1.x != t2.x)
return t1.x < t2.x -->按x降序
return t1.y > t2.y -->x相等时按y升序
}
};
priority_queue<T, vector<T>, cmp> que;
- 最大公约数
int gcd(int a, int b){
if(b==0) return a;
return gcd(b,a%b);
}
-
整数除法默认向下取整
-
可以连等赋值: a=b=1;