-----树-------
Icefox_zhx
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
spoj_cot2 Count on a tree II(树上莫队+离散化)
题意:给两个点u,v,询问两点路径上有多少种不同的权值。树上莫队。然后权值要离散化。树上区间转移呢,基本就是这样的:记上次询问的两点为lastu,lastv,现在询问的两点为u,v,那么对于路径(lastu,u)上的所有点的存在性取反(就是原来答案里有就删掉,没有就加上),对于(lastv,v)同理。但是因为还有讨厌的lca的存在,所以我们一直都没把lca放在答案里。最后记答案时单独处理lca。具原创 2017-07-20 15:30:12 · 540 阅读 · 0 评论 -
CF 375D Tree and Queries(子树询问,转化为序列莫队)
题意:给定一棵树,每个点有颜色,m个询问vi,ki,问以vi为根的子树中有多少种颜色出现的次数>=ki。首先我们可以通过dfn把子树询问变成序列询问。(不会看代码,一颗子树中的顶点的dfn一定是连续的,画画就知道了)然后就是经典的莫队了,至于ans怎么更新,见代码啦~原创 2017-07-20 16:02:15 · 448 阅读 · 0 评论 -
bzoj3052 [wc2013]糖果公园(树上莫队,带修改)
树上莫队参见spoj_cot2,带修改莫队参见bzoj2120.这道题就是把这俩和在一起了╭(╯^╰)╮。bzoj上时间很宽松。。大家如果没把握还是不要去爆oj了的好。给大家推荐个好地方UOJ,这题的题号是58。可以先在那过了再说。。uoj的评测机好好的说。。顺便我树上莫队也是从建了uoj的vfk那里学来的。。大家可以去搜一下他的博客。我在这里放链接是不是算侵权??不懂。。只能orz神犇。(因为打原创 2017-07-21 21:19:46 · 668 阅读 · 0 评论 -
CF 832D Misha, Grisha and Underground(Tree+lca)
题目大意:给你一棵树,n个节点。q个询问,给你a,b,c三个点,任意对应s,f,t,记s到f的路径为(s,f),让你求(s,f),(t,f)两条路径上的点的交集大小最大为多少。首先我们发现,对于给定的a,b,c,就三种情况即f=a,f=b,f=c.所以我们只需计算三次s,f,t,取最大即可。现在考虑对于给定的s,f,t,如何计算路径上的点的交集。设l1=lca(s,f),l2=lca(t,f),l原创 2017-07-26 13:30:18 · 475 阅读 · 0 评论 -
Codeforces Round #428
CF839A Arya and Bran(模拟)CF839B Game of the Rows(贪心)CF839C Journey(树+概率)原创 2017-08-13 12:35:34 · 360 阅读 · 0 评论 -
bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏(dfs)
这水题刷的。。。原创 2017-09-15 15:43:34 · 503 阅读 · 0 评论 -
hdu5877 Weak Pair(dfs+线段树+离散化)
给定一棵有根树(注意跟不一定是1.。。),求有序对(u,v)满足的个数: 1.u是v的祖先 2.a[u]*a[v]<=k。 我们在对树进行dfs时,做到v点,此时在我们的dfs栈中的点正是v的祖先,一个不多,一个不少,我们只需在这些点中找到小于等于k/a[v]的点。显然可以把权值离散化了,用线段树来维护原创 2017-09-25 20:35:25 · 355 阅读 · 0 评论 -
hdu5692 Snacks(线段树+dfs序)
我们维护每个点到根的权值和。询问过x的路径中权值最大的,即询问x的子树中到根的距离最大的。修改x为y,则x的子树中的所有点到根的距离都加上了y-a[x]。显然可以用dfn变成连续区间用线段树来维护。原创 2017-09-25 21:53:26 · 426 阅读 · 0 评论 -
poj2631 Roads in the North(求树的直径裸题)
两遍bfs求树的直径(就是树上的最长链) 这里给出树的直径的证明: 主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路。 证明: 1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则 d原创 2017-09-17 16:30:36 · 467 阅读 · 0 评论 -
NOIP模拟9.16(TYVJ NOIP2017模拟赛D1)
TYVJ NOIP2017模拟赛D1T1 天天去哪吃(模拟)T2.天天和树。(求树的直径)T3.摆摊。(类似mex,离线+线段树)原创 2017-09-17 16:26:16 · 450 阅读 · 0 评论 -
bzoj1232 [Usaco2008Nov]安慰奶牛cheer(kruskal)
对树dfs的性质是,遍历过程中每条边会被访问两次,点访问次数为度数,起点再多一次。 于是我们把遍历的过程每条边分开考虑。 每一条边对答案的贡献为边权*2+两点的点权。 按新权求一棵最小生成树再加上最小点权(作为起点访问)即可。原创 2017-09-26 13:30:01 · 374 阅读 · 0 评论 -
CF343D Water Tree(线段树+dfs序+思路)
首先对于操作一,我们按照老套路把树上结点用dfs序变成序列,每个结点的子树均为in[x]~out[x]连续的一段,段修改即可。对于操作2,往上找父亲肯定不好实现,怎么办呢?我们只改这一个点,把他改为0,然后在询问x点的时候,我们查询x的子树中是否有0,有的话他一定也是0(他一定是那个点的父亲)。这样就很巧妙的把一个点会影响他的所有祖先转化成了单点修改,查询子树。需要注意的是,这样做的话,做操作1时要原创 2017-10-07 22:39:49 · 414 阅读 · 0 评论 -
bzoj3206 [Apio2013]道路费用(kruskal+并查集+状压枚举+dfs)
我们先优先的把k条指定边加入到生成树中。这时候生成树中的非指定边是必选的,无论在那种方案中。因此我们先把这些点缩成一个点,这样,我们最多剩下了k+1个点。(把图中的边清空,加入必选边,连通块缩成点,这样我们会得到一个点数不超过 K + 1 的图,令此图为新图(注意,新图中不包含任何边,只有那至多 K + 1 个点))同时 m 条边中必选边之外的边如果放在新图中会有很多重边,将这些重边合并,于是压缩成原创 2017-09-29 16:42:26 · 460 阅读 · 0 评论 -
NOIP模拟9.27
2013提高D1 A.转圈游戏(快速幂)AC B.火柴人排队(树状数组求逆序对)AC C.货车运输(贪心+并查集+树上倍增)AC原创 2017-09-27 11:31:51 · 405 阅读 · 0 评论 -
AtCoder Grand Contest 010
%%%leoly %%%Visjiao %%%Elijahqi 题解可以去看VisJiao大佬的:传送门 AtCoder Grand Contest 010 A.Addition(数学,奇偶性) B.Boxes (数学) C.Cleaning(树+结论) D.Decrementing(数论+gcd+奇偶性) 都是思维题,这我哪会啊。。。Visjiao大佬的题解写的很详细orz原创 2017-10-26 21:53:06 · 540 阅读 · 0 评论 -
CIA2 城市网络(树上倍增)
题目描述有一个树状的城市网络(即n个城市由n−1条道路连接的连通图),首都为1号城市,每个城市售卖价值为a[i]的珠宝。你是一个珠宝商,现在安排有q次行程,每次行程为从u号城市前往v号城市(走最短路径),保证v在u前往首都的最短路径上。在每次行程开始时,你手上有价值为c的珠宝(每次行程可能不同),并且每经过一个城市时(包括u和v),假如那个城市中售卖的珠宝比你现在手上的每一种珠宝都要优秀(价值更高,原创 2017-10-11 22:16:38 · 745 阅读 · 0 评论 -
bzoj4719 [Noip2016]天天爱跑步(树+lca+树上差分+思路题)
进入bzoj法眼的noip(lus)题hh。题解太麻烦啦。。。不写啦。。。就体会一下思想:要是对于每条路径操作,看他会影响哪些点的贡献,铁铁的会t。所以考虑怎样的一条路径会对一个点产生贡献,先讨论简化版的链的情况,发现要讨论左右。结合另外两个部分分,感觉就是把路径分成两半,x->lca,lca->y。分别讨论,然后进行神奇的树上差分,用vector来维护删除操作。题解去观摩这里吧原创 2017-11-01 21:47:38 · 495 阅读 · 0 评论 -
NOIP2007提高组
2007提高 A.统计数字(模拟) B.字符串的展开(模拟) C.矩阵取数游戏(dp+高精度) 考虑倒着dp,dp[i][j]表示还剩i…j的数,把这些取走的最大得分。决策无非两种,先拿i,先拿J. D. 树网的核(树的直径+贪心+暴力枚举) n=300,各种瞎搞。如果只能选一个点的话,一定选中心最优,因此我们以中心为根,贪心的去扩展。每次看能不能把最远的点干掉。。不能时就是答案了。原创 2017-11-17 10:48:55 · 547 阅读 · 0 评论 -
NOIP模拟10.26
Poetize11 A.rainbow. 挂精度了。30。思路好像也有点问题·。。。正解是二分答案,通过勾股定理求出每个半圆能够覆盖的线段。此时问题转化为线段覆盖问题,排序扫描一遍即可。(直接拿圆判可能会有特例?) B.clover。状压dp+dfs瞎搞。。70. C.fin。dp打表了AC hh。实质上可以根据这道题的特性,把dp优化下,简直黑科技。处理出深度为d时,可能的最大节点数和最小节原创 2017-10-26 16:28:31 · 417 阅读 · 0 评论 -
NOIP2003提高组
2003提高 A.神经网络(拓扑模拟) B.侦探推理(字符串+模拟) 太恶心了,不会写。 C.加分二叉树(区间dp+树的遍历) 因为中序遍历是1~n,所以如果根是k的话,左子树一定是1~k-1,右子树一定是k+1~n。这样就可以区间dp了。顺道记一下跟,方便输出前序遍历 D.传染病控制(搜索+剪枝) 实质上相当于在每层选一条边砍掉,可以爆搜,加个最优性剪枝。注意一个点安全了,只要它的祖先原创 2017-11-18 15:40:10 · 723 阅读 · 0 评论 -
bzoj2588 Count on a tree(树上建主席树求路径第k大)
主席上树(划去。 每个点建一棵权值线段树,记录从这个点到根的路径上的点权信息。x可以和fa[x]的线段树共用很多信息,所以上主席树!那么x到y路径上的点权信息,就是tree[x]+tree[y]-tree[t]-tree[fa[t]],t表示lca(x,y)。原创 2017-12-01 19:37:46 · 598 阅读 · 0 评论 -
bzoj3551 [ONTAK2010]Peaks加强版(kruskal重构树+dfs序+主席树+树上倍增)
题意同bzoj3545,只不过强制在线了。那强制在线了怎么搞呢x,有一个神奇的东西,kruskal重构树,张这个样子:传送门。他有很多优美的性质:首先,他一定是一颗二叉树,然后所有叶子节点一定是原图中的点,从叶子节点往跟走,点权一定是单调不降的。如果原图中有n个点,则这棵树一定有n+n-1个点(因为你需要合并n-1次,也就新建了n-1个点)。然后对于这道题而言,你可以从v开始在树上倍增找到第一个小于原创 2017-12-04 19:31:04 · 510 阅读 · 0 评论 -
suoj22 WRX知识树(非递归dfs+树上差分)
题目传送门:portal %%%SBW,把我卡到飞、。 upd:pickupwin太强辣!更新了一波数据就又把我卡成狗啦! 强行手动模拟dfs才能过呀x,为了保证dfs序的性质,我们要用双端队列呀x#include <cstdio>#include <cstring>#include <algorithm>#include <queue&g...原创 2017-12-06 19:19:37 · 371 阅读 · 0 评论 -
bzoj3257 树的难题(树形dp)
dp[x][i][j]表示以x为根的子树,与x相连的有i个黑点,j个白点,其他的点都满足要求的最小代价。超过1个的黑点视作1个,超过2个的白点视作2个。每次转移用已经做过的儿子们的状态和现在儿子的状态,注意不能像背包那样往上叠加,因为不可以不取现在这个儿子。然后对于当前这个儿子无非两种决策:连在x上,断掉。如果断掉,必须满足儿子的状态是均衡的,即!i||j<2。别忘了每次把x自己的颜色加上。最后答案原创 2018-01-13 20:36:05 · 466 阅读 · 0 评论 -
bzoj1468 Tree(点分治)
点分治,就是每次找到目前子树的重心,把它当做根,处理所有过重心的路径信息,然后递归处理子树。 什么是一棵树的重心呢?选出的一个点,使分出的子树中节点数最大的子树最小,就是重心。这样分出的子树点数不超过n/2+1,就可以保证复杂度了。怎么找重心呢?我们就按定义来找,每次O(n)。然后每次递归时处理过根的合法点对。怎么做呢?我们容斥一下,变成给定一个数组,问有几个有序对满足和<=K。我们可以排序+线原创 2018-01-16 10:49:33 · 355 阅读 · 0 评论 -
bzoj2152 聪聪可可(点分治/树形dp)
就是求路径和%3余0的有序点对个数。可以点分治。还可以树形dp。 dp[i][j]表示以i为根的子树中的点,到i的路径长度%3余j的个数。每次统计一下过i的答案就好了。点分治原创 2018-01-16 21:42:27 · 399 阅读 · 0 评论 -
bzoj3697 采药人的路径(点分治+dp)
把边权0变成-1,路径边权和为0就是阴阳平衡了。我们点分治,考虑一条过根的路径,被根分成两部分,如果是合法的,那么休息站不是在前半段,就是在后半段。我们记g[i][0]表示到根的边权和为i,且不存在休息站的路径数;g[i][1]表示存在休息站的路径数。一个一个子树的做,避免不合法的情况。用tmp[i][0/1]表示已经做过的子树的信息。则对答案的贡献就是 g[0][0]∗tmp[0][0]+∑i=原创 2018-01-17 14:29:24 · 609 阅读 · 0 评论 -
bzoj4519 [Cqoi2016]不同的最小割(最小割树,分治)
求所有点对的最小割中,不同的最小割数值有多少个。我们建出等价流树,看这n-1个最小割有几个不同的就好啦。原创 2018-01-09 13:13:02 · 473 阅读 · 0 评论 -
bzoj2229 [Zjoi2011]最小割(最小割树,分治)
一个n个点的图,对于任意四点x,y,z,w,他们的最小割可以不相交。这样我们就可以分治的来求出等价流树。等价流树就是这样一棵树,使得图中两个点的最小割的权就是树上对应链上的最小边权。好像和最小割树不太一样?怎么分治呢?首先对于点集V,我们钦定一个S和T,跑最小割,把原图分成S集和T集,更新所有目前被割开的点的最小割,然后再分治S集和T集。如果要建出这棵树呢?就是每次求出S到T最小割以后,建边(S,原创 2018-01-09 11:38:36 · 421 阅读 · 0 评论 -
bzoj3219 巡游(二分答案+点分治+单调队列)
求中位数最大的路径。我们二分答案,把>=mid的边都变成1,< mid的边都变成-1,如果有一条路径的权值和≥0,则中位数可以为mid。所以我们就是要去找一条权值和最大的路径。具体做法与bzoj1758相同。 我把leoly慢了8s啊,orz原创 2018-01-18 09:08:31 · 447 阅读 · 0 评论 -
bzoj1758 [Wc2010]重建计划(二分答案+点分治+单调栈)
首先求一个最优比率的东西,我们二分答案,转化成判定是否存在一条合法路径使得边权和≥0.然后这个东西我们点分治去做。每次计算过x的合法路径的最大值时,为了避免不合法,我们一个子树一个子树的做。我们处理出g[i],表示目前这棵子树深度为i的点的最大距离,tmp[i]表示之前做过的子树深度为i的点的最大距离。我们每次用g[i]去询问tmp,也就是要在tmp[l-i,r-i]中选一个最大值,我们发现这就是一原创 2018-01-17 22:38:47 · 898 阅读 · 0 评论 -
bzoj3672 [Noi2014]购票(dp+斜率优化+点分治+cdq分治)
首先考虑如果是序列怎么做,比较明显的dp,dp[i]表示i走到1的最少花费,则 dp[i]=min{dp[j]+(dis[i]−dis[j])∗p[i]+q[i]|j<i,dis[i]−dis[j]<=li[i]}dp[i]=min\{dp[j]+(dis[i]-dis[j])*p[i]+q[i] |j<i,dis[i]-dis[j]<=li[i]\} 我们自然想到斜率优化,我就不推式子了qaq原创 2018-01-18 13:40:52 · 430 阅读 · 0 评论 -
bzoj1131 [POI2008]Sta(树形dp)
dp[i]表示以i为根的深度和。则转移方程为: dp[i]=dp[fa[i]]−sz[i]+n−sz[i]dp[i]=dp[fa[i]]-sz[i]+n-sz[i]。相较于fa[i]为根时,i为根时,i的子树深度都小了1,剩下的点深度都大了1。原创 2018-01-10 13:32:59 · 333 阅读 · 0 评论 -
bzoj1103 [POI2007]大都市meg(树+差分+树状数组)
给出一棵树,每次查询一个点到根的路径边权和,有边修改。直接差分+树状数组。原创 2018-01-10 14:15:07 · 402 阅读 · 0 评论 -
hdu4547 CD操作(lca+map)
就是求lca。。。要注意如果A=B的话是需要0步。字符串映射可以采用map。原创 2018-01-26 21:09:43 · 391 阅读 · 0 评论 -
bzoj1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树/动态点分治+堆)
括号序列做法真是神神神呀qaq直接去看岛娘的博客吧:传送门。 或者直接去看noi2008国家集训队论文《数据结构的提炼与压缩》 by cqx1.20upd:终于看懂了点分治+堆的方法…orz hzwer 准确理解每个堆的意义很关键… C[x] 维护的是x所控制的子树中每个点到x在重心树中的父亲的距离 B[x] 维护的是x所控制的子树中以x的每个儿子为根的子树到x的最大距离,即在重心树中x的每原创 2018-01-19 09:44:39 · 555 阅读 · 0 评论 -
USACO2018FEB Gold
A.snowboots(离线+贪心+并查集) 都按S排序以后,每次把不能走的染黑,如果任意一段连续的黑色个数小于< d的话我就可以通过,否则不行。可以用并查集来维护最大子段和。复杂度O(nlogn)O(nlogn)B.dirtraverse(树+搜索+递推) 首先处理出选1做当前目录的答案,然后可以直接递推得到选儿子y做当前目录的答案,f[y]=f[1]−(len[y]+1)∗sz[y]+3∗(原创 2018-02-26 15:56:17 · 797 阅读 · 0 评论 -
bzoj1146 [CTSC2008]网络管理(树上主席树,树状数组套动态加点线段树)
给定一棵树,查询路径第k大值,带修改。 就是bzoj2588+bzoj3196 树上建主席树。然后对于修改,修改点x的权值,只会对x的子树有影响,而x的子树在dfs序上是连续的一段in[x],out[x],就相当于区间修改,我们利用差分+树状数组来维护,另建bit+动态加点线段树来维护。 树状数组套动态加点线段树内存究竟怎么算.jpg???能开多大是多大好了,反正是要比logn^2小很多?这样原创 2018-02-26 20:45:05 · 414 阅读 · 0 评论 -
bzoj3282&&luogu3690【模板】Link Cut Tree (动态树)
觉得这篇blog讲得不错:传送门 模板题。lct,动态树,树的形态可以变化的树链剖分,用splay来维护每条重链上的信息。#include #include #include using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 300010inline int read(){原创 2018-01-31 16:12:00 · 425 阅读 · 0 评论 -
bzoj3435 [Wc2014]紫荆花之恋(替罪羊树+动态点分治+treap)
我们维护点分树,每个节点维护一颗平衡树,记录所有子树中的点的值。然后查询时我们往上一直跳就好了,注意要去掉不合法的情况,因此我们每个点还要再维护一个平衡树,记录所有子树中的点到fa[p]的值,往上跳的时候减掉不合法的即可。然后因为是动态生成点的,所以我们不时地要重构一下。利用替罪羊树的思想重构即可。 值得注意的几点:每次重构时,要把此次需要重构的点标记出来,在点分治dfs时不要访问不需要重构的点...原创 2018-02-27 23:16:10 · 679 阅读 · 0 评论
分享