树上DFS

树上DFS

基础板子

树上$DFS$一次性维护信息
$g$ : 邻接矩阵存储边的信息
$dep$ : 结点的深度
$fa$ : 父节点
$siz$ : 子节点个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const int N = 200000 + 5;
vector<int> g[N];
int n;
int fa[N], dep[N], siz[N];

void dfs(int u, int p){
fa[u] = p; // 记录父亲
dep[u] = dep[p] + 1; // 深度:根 dep[1]=1(dep[0]=0 作为哨兵)
siz[u] = 1; // 子树大小先算自己

for(int v : g[u]){
if(v == p) continue; // 无向边防止走回父亲
dfs(v, u); // 先把孩子子树算完(后序关键)
siz[u] += siz[v]; // 再把孩子子树大小累加到 u
}
}

void solve(){
cin >> n;
for(int i=1;i<=n;i++){
g[i].clear();
}

for(int i=1;i<n;i++){
int u,v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}

dep[0] = 0; // 哨兵
dfs(1, 0); // 根为 1,父亲设 0
}
阅读更多

AtCoder Beginner Contest 440题解

AtCoder Beginner Contest 440题解

A

题意

求$X$翻倍$Y$次的结果 是翻倍不是求幂QAQ

思路

位运算或者$pow()$

代码

1
2
3
4
5
6
7
void solve(){   
int x, y;
cin >> x >> y;
// cout << x * pow(2, y) << endl;
while (y --) x <<= 1; // 位运算
cout << x << endl;
}
阅读更多

杂项知识

下面是我整理的平时碰到的一些奇怪的错误总结的奇怪的提示,持续更新(哈哈

使用排序/查找

  1. lower_bound如果没有找到大于等于的值返回a.end()

  2. lower_bound返回值是一个迭代器,*解值,-begin()返回序列pos

  3. sort排序左闭右开区间

优先级

1
cout << (x ^ pre) << ' ';

这里一定要加括号否则报错

阅读更多