
树相关
bestFy
世界上最最最渣的oier.
展开
-
codeforces790B - Bear and Tree Jumps
题面在这里题目大意:有一棵树,在树上每一步 可以跳k条边。设f(s, t)表示从s到t的最小步数。求所有点对的f值之和。先考虑k = 1的情况,那么就是求树上任意两点的距离之和,相当于求每一条边被经过的次数,答案应该就是任意一条边左右两边点数的乘积之和。然后如果k != 1,那么在一条路径长度不被k整除的时候就会出现问题,因为有一个余数,这个余数我们需要再走一步。处理这原创 2017-11-17 21:58:02 · 396 阅读 · 0 评论 -
bzoj4390: [Usaco2015 dec]Max Flow
题面在这里题意:给一棵树,k个操作,每次将u-v的路径上的点权都加一。 问最后最大的点权。做法:树上差分裸题= = 找u-v的lca,然后将路径上的点+1相当于c[u]++,c[v]++,c[lca]–,c[fa[lca]]–. c[]是差分数组。代码:/************************************************************* Prob原创 2018-01-02 17:43:16 · 225 阅读 · 0 评论 -
bzoj3246: [Ioi2013]Dreaming
题面在这里题意:给一个森林,要你用边权为w的边把森林连成一棵树,问树的最小直径。做法:肯定是将每一棵树的中心(直径的中点)连起来。 然后你肯定是连成一个菊花图最优。 并且菊花图最中间那个点肯定要放直径最长的那棵树。 于是答案等于 1.每个树的直径的最大值 2.最大半径+次大半径+w 3.次大半径+第三大半径+w+w 这三种的最大值。易错点:保存前三大的时候初始值要赋为-1e18,亲测,原创 2018-01-03 12:22:40 · 313 阅读 · 0 评论 -
codeforces766E - Mahmoud and a xor trip
题面在这里题意:给一棵树,每个点有点权。 询问任意两点路径上点权的异或和。做法:由于是异或和,可以先枚举每一位,分别DP。 记f[u][0/1]为以u为根的子树中,路径异或值为0/1的点对数量。 ans统计时利用乘法原理。然后要再乘上1<<p1<<p(p是当前的位数)。 推f[]的时候按照当前位的0/1分类讨论一下。代码:/**********************************原创 2018-01-03 15:44:58 · 376 阅读 · 0 评论 -
codeforces724G - Xor-matic Number of the Graph
题意:一个无向图,边上有边权。定义一条路的价值为这条路径上边权的异或和,两个点之间的价值为它们所有路径不同价值的和,整个图的价值为所有点对价值的和。 求整个图的价值。做法:首先考虑对于树的做法:记点i到根路径的异或和为f[i],则点对u,v路径的异或和就是f[u]^f[v]. n^2做法就直接枚举任意两点。 考虑“异或”的套路:由于每一位互不干扰,我们可以按位处理。 对原创 2018-01-15 14:03:38 · 328 阅读 · 0 评论 -
loj#6208. 树上询问
题面在这里题意:给一棵树,三种操作: 1.add(x,d),给x到根路径上的点的ki += d 2.mul(x,d),给x到根路径上的点的ti += ki*d 3.询问一个点的ti值做法:树链剖分以后就变成一道线段树好题了qaq 我们考虑在线段树里维护一个tag(a,b,c),ti值即为a*b+c。 这里的a相当于ki。 对于2操作,我们直接b+=d就可以。原创 2018-01-07 22:51:20 · 607 阅读 · 0 评论 -
CC FIBTREE Fibonacci Numbers on Tree
题面在这里题意:给一棵树,有4种操作: 1.询问以x为根时y子树内的点权和。 2.询问x~y链上的点权和。 3.将x~y这条链展开,第i个点加上fibifib_i,其中fibifib_i表示斐波那契第i项,fib1=fib2=1fib_1 = fib_2 = 1。 4.恢复到第x个操作时的状态。 本题强制在线。做法:首先fibi=15√×((1+5√2)i−(1−原创 2017-12-28 11:28:34 · 337 阅读 · 0 评论 -
bzoj2815: [ZJOI2012]灾难
题面在这里题意:有一个n个点的关系图,u->v有边表示u能吃v。 去掉某个点以后会有一些点没有东西吃,每个点的灾难值定义为如果去掉这个点,会没有东西吃的点的个数。 求每个点的灾难值。 n做法:好妙啊QAQ..首先这个不是树很难受,如果是一棵树,就可以直接计算子树大小得到答案了。 我们考虑把图化成一棵树。 观察到一个奇妙的性质,一个点u,如果和很多点v1,v2…原创 2018-01-28 14:47:18 · 430 阅读 · 0 评论 -
loj#2324. 「清华集训 2017」小 Y 和二叉树(贪心+分类讨论)
题面在这里题意:给出一棵每个点度数不超过3的无根树,节点编号为111~nnn 你需要确定根和每个节点的左右儿子,使其成为一棵二叉树。 问所有可得到的二叉树中中序遍历字典序最小的树的中序遍历。 n≤1,000,000n≤1,000,000n ≤ 1,000,000做法:这题似乎当时集训队全场ac 首先找出一个最小的度≤2≤2\le2的点作为最左边的拐角点,也就是中序遍历的第一...原创 2018-03-06 00:39:15 · 439 阅读 · 0 评论 -
codeforces911F - Tree Destruction
题面在这里题意:给一棵树,执行n次操作,每次操作流程如下: 1. 选两个叶子节点 2. 将答案加上这两个节点的距离 3. 删去任意一个节点要求最后答案最大。 问最大的答案以及构造出操作步骤。做法:一个简单的想法就是找一个深度最深的叶子,去更新别的叶子。 我们来看具体的情况。假设是下面这张图。红色的点就是深度最深的点,绿色是深度次深的点,且他们是处在根的不同儿子所在的子树。 于是对于最右边原创 2017-12-30 02:30:14 · 496 阅读 · 0 评论 -
bzoj3862: Little Devil I
题面在这里 题目大意: 给一棵树,每条边有黑白两种颜色。有3种操作:一条链上的边的颜色取反(黑->白,白->黑);与一条链相邻的边的颜色取反,相邻就是指只有一个点在链上的边;询问某条链上黑边的数量。开始时边的颜色都是白。做法: 1操作和3操作就是普通的树剖+线段树,很容易维护。 主要是2操作。 我们考虑维护两棵线段树,T[0]T[0]维护正常的边修改,T[1]T[1]是辅助用的,当原创 2017-12-07 11:17:10 · 318 阅读 · 2 评论 -
poj3237 Tree
题面在这里题目大意:有一棵树,要求支持树上单点修改,链取反(相反数),询问链上最大边权。做法:额....树剖裸题。维护一个线段树,打tag表示取不取反,然后线段树里要维护最大的和最小的值mx[o]和mi[o],更新的时候就是:swap(mx[o], mi[o]); mx[o] = -mx[o]; mi[o] = -mi[o]。然后先欣赏一下我的艰辛历程emmmm原创 2017-12-04 23:26:15 · 227 阅读 · 0 评论 -
bzoj1036: [ZJOI2008]树的统计Count
题面在这里树链裸题。。直接上代码qwq/************************************************************* Problem: bzoj 1036 [ZJOI2008]树的统计Count User: fengyuan Language: C++ Result: Accepted Time: 2388 ms Mem原创 2017-11-18 21:31:55 · 290 阅读 · 0 评论 -
bzoj2243: [SDOI2011]染色
题面在这里做法:树剖,就是线段树上要做点文章。要维护区间左端和右端的颜色,要打覆盖标记。合并的时候注意相同颜色答案要减一。/************************************************************* Problem: bzoj2243 [SDOI2011]染色 User: fengyuan Language: C++原创 2017-12-05 01:42:31 · 242 阅读 · 0 评论 -
poj2763 Housewife Wind
题面在这里题目大意:有一棵树,每条边有边权,一个人初始在s点。现在有两种操作,一是修改某条边的边权,二是询问这个人走到x点经过的边权总和,并移动到x点。做法:树剖。线段树维护区间和。(第一次树剖一次过qwq太感动了)/************************************************************* Problem: p原创 2017-12-05 18:13:47 · 1195 阅读 · 0 评论 -
bzoj4034: [HAOI2015]树上操作
题面在这里做法:树剖。线段树维护区间和,打lazy标记。其中子树加就是在dfs序上in[x]到out[x]一段加。/************************************************************* Problem: bzoj 4034 [HAOI2015]树上操作 User: fengyuan Language: C++ R原创 2017-12-05 20:42:54 · 298 阅读 · 0 评论 -
bzoj3626: [LNOI2014]LCA
题面在这里做法:首先说明以下都是以1为根的,点的编号是1~n。考虑最暴力的做法:对于一个询问l, r, z,将1~z的点全部打标记,枚举l~r之间的点u,从1~u的路上找到第一个打标记的点,答案就加上这个点的深度。然后稍微转化一下,假如把1~z的点权+1,然后对于l~r之间的点u,询问1~u之间的点权和,答案加上这个和。(正确性显然)再转化,我们把l~r之间的点u,1~u上点权原创 2017-12-05 23:21:56 · 262 阅读 · 0 评论 -
bzoj3531: [Sdoi2014]旅行
题面在这里 做法: 树剖+线段树动态开点。 容易想到对每个宗教建一棵线段树,不过空间限制不够,所以需要动态开点。别的都和正常树剖一样。代码如下:/************************************************************* Problem: bzoj 3531 [Sdoi2014]旅行 User: fengyuan Lang原创 2017-12-06 13:01:17 · 251 阅读 · 0 评论 -
bzoj2325: [ZJOI2011]道馆之战
题面在这里 题目大意: 这题题目太长了就简单说一下题意。 给一棵树,每个节点分为两个区域A,B,在树上一个节点的某个区域,可以走到相邻节点的同一个区域,或同一个节点的另一个区域。每个区域内有两种状态,’.’表示冰,’#’表示障碍(障碍不能通过),给一些查询u, v,询问从u走到v能经过的最多冰的数量。同时还有一些修改操作,将某一点两个区域修改为s(s是长度为2的字符串)。做法: 这题花了我一原创 2017-12-06 17:57:03 · 332 阅读 · 0 评论 -
uoj#295. 【ZJOI2017】线段树(树上倍增)
先放代码,日后更。============================2018.3.21UPD============================ 题面在这里做法首先需要了解zkw线段树的操作过程。(不懂的百度一下) 大概就是从两个叶节点开始,维护两个指针,一个指向lll左边一位,一个指向rrr右边一位,不停向上跳。然后模仿这个过程同样在这个广义线段树上操作,画一下图可以发...原创 2018-03-14 12:05:48 · 386 阅读 · 0 评论