
dfs、欧拉序
.
做一只大熊猫
让优秀成为一种习惯!
展开
-
K 因子最小数 Gym - 102785D
题意由 k 个不同因子组成的最小数,k <= 1000, 需要用大数去写。思路数n=p1r1+p2r2+p3r3+...+pmrm n=p_1^{r1}+p2^{r2}+p3^{r3}+...+pm^{rm}n=p1r1+p2r2+p3r3+...+pmrm, 组成的因子个数为:(r1+1)∗(r2+1)∗(r3+1)∗...∗(rm+1)(r1+1)*(r2+1)*(r3+1)*...*(rm+1)(r1+1)∗(r2+1)∗(r3+1)∗...∗(rm+1), 若具有 k 个因子原创 2021-03-30 09:00:18 · 221 阅读 · 0 评论 -
E - 树上操作 黑暗爆炸 - 4034(欧拉 序+线段树区间和)
题意有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。思路代码#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <原创 2021-03-03 21:40:56 · 153 阅读 · 1 评论 -
D - Snacks HDU - 5692(dfs 序+线段树维护树上前缀和)
题意给我们一棵有 n 个节点的树,结点点编号从 0 开始,每个节点 i 有权值 a [i],给我们 2 种操作,0 x y 第一种:修改 x 点的权值为 y1 x 第二种:从 0 结点出发经过 x 的路线中,点权和最大的路线的,点权和是多少?,有 m 次询问思路这题真是一个很不错的题,里面的思路很巧妙,但也有 坑首先坑我最狠的一个坑是:懒标 lazy 的数据类型是 long long。首先我们先对这棵树跑个 dfs 序,在跑 dfs 序的时候,顺带求出树上前缀和,之后用线段原创 2021-03-03 21:25:03 · 122 阅读 · 2 评论 -
C - New Year Tree CodeForces - 620E(dfs 序+线段树(维护颜色用状态压缩))
题意给你一颗 n 个节点的树,1 为根节点,每个节点被染上了颜色,然后就是 m 次查询。 查询的方式有两种 1,将以 z 为根的子树的结点全部更新为颜色 X 2,问以 z 为根的子树的结点的不同颜色数量。思路先用 dfs 序,给这棵树上的节点重新变一下编号(盖上时间戳), 这样把树形问题变成了 线性区间问题,就可以用线段树及决问题了,由于颜色种类少,所以用线段树维护颜色的话可以用二进制状态压缩(每个 bit 位表示一种颜色),来表示,这样当两个颜色合并的时候,只需要把 两种颜色状态相或 | 就原创 2021-03-03 21:06:46 · 150 阅读 · 1 评论 -
B - Apple Tree POJ - 3321(欧拉序+树状数组)
题意给我们一棵有 n 个节点的树,编号从 1 开始,提供两种操作,第一种:C x, 如果 x 节点的权值为 0,怎么变成 1,反之亦然。第二种,Q x,查询以 x 为根的这颗子树中,的权值之和,并输出,思路这题明显像是用线段树维护区间和、单点修改决掉的问题,单点修改容易实现,但是第二种操作难以实现,这个时候我们就要用到神奇的 “欧拉序” 了变一个树形结构的问题变成线性的区间问题,我对这棵树跑 欧拉序,然后每个节点 i 都有一个区间 [ in [i], out [i] ], 且子节点原创 2021-03-03 20:49:18 · 144 阅读 · 1 评论 -
A - Counting Offspring HDU - 3887(欧拉序+树状数组)
题意给我们一个有 n 个节点的树,节点编号从 1 开始,定义函数:f [i] 表示在节点 i 的子树中,编号比 i 小的节号数量。让我们输出,依次输出:f [i] (i = 1, 2, …,n).欧拉序、dfs 序传送门 1传送门 2思路先对给的树,从根节点开始跑一遍 欧拉序,这样每个节点又有一个区间[ in[i], out[i] ] [~~in[i],~~out[i]~~][ in[i],&原创 2021-03-03 20:19:12 · 159 阅读 · 1 评论