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 · 185 阅读 · 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 · 129 阅读 · 1 评论 -
D - Snacks HDU - 5692(dfs 序+线段树维护树上前缀和)
题意 给我们一棵有 n 个节点的树,结点点编号从 0 开始,每个节点 i 有权值 a [i],给我们 2 种操作, 0 x y 第一种:修改 x 点的权值为 y 1 x 第二种:从 0 结点出发经过 x 的路线中,点权和最大的路线的,点权和是多少?, 有 m 次询问 思路 这题真是一个很不错的题,里面的思路很巧妙,但也有 坑 首先坑我最狠的一个坑是:懒标 lazy 的数据类型是 long long。 首先我们先对这棵树跑个 dfs 序,在跑 dfs 序的时候,顺带求出树上前缀和, 之后用线段原创 2021-03-03 21:25:03 · 102 阅读 · 2 评论 -
C - New Year Tree CodeForces - 620E(dfs 序+线段树(维护颜色用状态压缩))
题意 给你一颗 n 个节点的树,1 为根节点,每个节点被染上了颜色,然后就是 m 次查询。 查询的方式有两种 1,将以 z 为根的子树的结点全部更新为颜色 X 2,问以 z 为根的子树的结点的不同颜色数量。 思路 先用 dfs 序,给这棵树上的节点重新变一下编号(盖上时间戳), 这样把树形问题变成了 线性区间问题,就可以用线段树及决问题了, 由于颜色种类少,所以用线段树维护颜色的话可以用二进制状态压缩(每个 bit 位表示一种颜色),来表示,这样当两个颜色合并的时候,只需要把 两种颜色状态相或 | 就原创 2021-03-03 21:06:46 · 113 阅读 · 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 · 117 阅读 · 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 · 131 阅读 · 1 评论