树
文章平均质量分 76
qingdaobaibai
这个作者很懒,什么都没留下…
展开
-
【bzoj3672】[Noi2014]购票 斜率优化+树链剖分+线段树+凸包+三分
f[i]表示从根到点i的最少票价f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i] } (dep[i]-dep[j]=f[j]-dep[j]*p[i]+dep[i]*p[i]+q[i]f[j]=dep[j]*p[i]+f[i]-dep[i]*p[i]-q[i]f[i]-dep[i]*p[i]-q[i]表示过点(dep[j],f[j])的斜率为p[i]的直原创 2016-03-23 10:50:29 · 754 阅读 · 0 评论 -
【bzoj1509】 NOI2003 逃学的小孩 树的直径
做以前的题感觉好水呀,第一想法是最短路,结果发现读错题了。后来想一下,只需要找到树的直径,然后从这两点求出到每个点的dis数组,然后枚举一下每一个点就可以了,这么水还调了这么长时间也真是颓废呀。#include#include#include#include#include#include#define maxn 210000#define inf 2000000010原创 2015-07-18 11:08:11 · 920 阅读 · 0 评论 -
【bzoj1005】 明明的烦恼——树的prufer编码
就用这道题来学一下prufer编码吧。 树的prufer编码可以唯一确定树的形状,即一棵树只有一个prufer编码,一个prufer编码只对应一棵树。 一棵n个节点的树的prufer编码长度为n-2,确定方法如下: (1)树的prufer编码的实现 不断 删除树中度数为1的最小序号的点,并输出与其相连的节点的序号 直至树中只有两个节点原创 2015-07-06 22:26:21 · 763 阅读 · 0 评论 -
【bzoj3307】雨天的尾巴 线段树+树链剖分
考虑如果在序列上的话,每次只需要在区间左端点+1,右端点-1,最后用线段树一起统计即可。在树上的话,就用树链剖分转换成序列,每一次操作,对应修改O(log n)条重链上的标记,最后用线段树来统计。#include#include#include#include#include#include#include#include#define maxn 200100u原创 2016-04-14 09:12:58 · 919 阅读 · 0 评论 -
【bzoj3569】DZY Loves Chinese II 线性基+树上小技巧
首先找到一棵dfs树,注意是dfs树,因为dfs树没有横叉边,所以好处理给每条非树边定一个随机权值,树边的权值就是所有覆盖这条树边的边的权值的异或和覆盖这条树边,即有一条边的两端分别位于这棵树去掉这条树边所形成的两个联通块中如果这个集合是线性无关的,则最终的图是连通的,否则是不连通的于是使用线性基来判断是否是线性无关即可如何处理一条树边的权值?因为dfs树只有返祖边,所原创 2016-05-11 22:01:33 · 1896 阅读 · 0 评论 -
【bzoj1040】[ZJOI2008]骑士 基环+外向树dp
这道题细节比较多。我们可以把整个图分成若干个联通块,每个联通块都是一棵树+一条边。对于每个联通块,我们找出环上的一条边(u,v),删去这条边,分别以u和v为根进行dp,最后把不取u和不取v中的最大值当做整个联通块的值。最后的答案就是所有联通块的值的和。注意处理重边的情况。#include#include#include#include#include#incl原创 2016-05-01 21:43:56 · 704 阅读 · 0 评论 -
【bzoj4568】[Scoi2016]幸运数字 线性基+树链剖分
什么鬼东西呀?就是把两个线性基合并的过程放在线段树上,倍增可做,反正我写的树剖,听说学校里某人在某次考试的考场上的O(nlogn)算法被O(nlog^2n)的树剖秒成渣了。异或没打括号,调了好久。#include#include#include#include#include#include#define maxn 20010using namespace st原创 2016-05-20 08:07:50 · 1303 阅读 · 0 评论 -
2016百度之星 - 初赛(Astar Round2A)题解
作为线下选手,非常不要脸的写一份题解……A、hdu5690题意:求m个x组成的数模k是否等于cm题解:两种做法,第一种,裸的矩阵乘法,构造矩阵{f(x,i),x}*{10 0}={f(x,i+1),x} {1 1}复杂度O(Tlog m)#include#include#include#include#include#i原创 2016-05-21 22:29:03 · 1831 阅读 · 2 评论 -
【bzoj2809】[Apio2012]dispatching 主席树+dfs序
这分明就是一道主席树傻逼题呀,在dfs序上建出主席树,每次在主席树上二分就可以了。#include#include#include#include#include#include#define maxn 101000#define inf 1000000000#define N 3400000using namespace std;int head[maxn],原创 2016-05-23 20:46:05 · 649 阅读 · 0 评论 -
【bzoj1086】[SCOI2005]王室联邦 树分块
比较有意思的题目,听说这是树分块的裸题?我们开一个栈,遍历一个节点,若该节点的几棵子树的大小>=B,那么就把他们分到一块,省会为当前节点这样做会剩下不到B个节点,这时候就利用栈传到上一层节点就可以最后会剩下不到B个节点,因为我们原来的块都是一定不超过2B的,于是把这B个节点放到最后一个块就可以#include#include#include#include#incl原创 2016-06-12 19:29:07 · 1271 阅读 · 0 评论 -
【bzoj2286】[Sdoi2011消耗战 虚树+dp
学一下虚树单次dp是O(N)的,总复杂度O(NM)但实际用不到O(N)个节点,只有O(K)个节点是有用的,若能建出一棵O(K)个节点的树,那么复杂度会变成O(∑K)把给定节点按照dfs序排序,维护一个栈,栈中的节点是根到栈顶元素的链上的节点加入节点x,设栈顶元素为p,t=LCA(p,x)若t==p,则直接加入x若t!=p,则找到栈中最后一个深度小于t的节点y,在y到p之间的原创 2016-07-08 15:40:15 · 508 阅读 · 0 评论 -
【bzoj3611】[Heoi2014]大工程 虚树+dp
无脑的dp,不想写题解了#include#include#include#include#include#include#include#define maxn 1000010using namespace std;int head[maxn],to[2*maxn],next[2*maxn];vector v[maxn],g[maxn];int size[ma原创 2016-07-08 21:34:02 · 701 阅读 · 0 评论 -
【bzoj4034】 HAOI2015 T2 树链剖分+小变形
这道题其实是个裸裸的树剖,重点在于怎样处理子树加操作,那么我们在建seq序列时,想办法把一颗子树建的连续起来就好了,那么我们就改变以往的顺序,利用dfs,先跑重链,在跑轻链,这样就把子树建到一起了,然后就非常简单了。话说,这道题跟NOI2015D1T2有什么区别么?#include#include#include#include#include#include#define原创 2015-07-18 19:16:38 · 463 阅读 · 0 评论 -
【bzoj1864】 ZJOI2006 三色二叉树 水题
当年ZJOI这么水呀,随便水一下,结果跪了半个小时。。。#include#include#include#include#include#include#define maxn 500010using namespace std;char s[maxn];int f[maxn][3],g[maxn][3];int n,m,num,id;void dfs(){ i原创 2015-07-20 17:51:14 · 580 阅读 · 0 评论 -
【bzoj3772】 精神污染 dfs序+主席树
PoPoQQQ的题解太神了,表示看了好久才看懂,于是自己写了一份题解祸害人类。 首先有一个结论对于一条路径x-->y,如果它的两个端点x和y都在另一条路径上,则这条路径被另一条路径包含。 那么问题转化为了对于一条路径,判断两个端点都在这条路径上的路径有多少条。 那么对于每一个节点x,我们用一个vector来存节点y,当且仅当存在一条路径x-->y。 我们说主原创 2015-08-06 15:56:27 · 1590 阅读 · 0 评论 -
【bzoj1758】[Wc2010]重建计划 二分答案+单调队列+点分治
首先二分答案ans,每条边权值减去ans,问题转化成整棵树中长度在[L,U]之间,权值和最大的路径是否大于0.点分治考虑如何求出经过根的所有路径对答案的影响,枚举根的每个儿子,g[i]表示当前子树中深度为i的节点的最大权值和f[i]表示之前的子树中深度为i的节点的最大权值和枚举i,查询f[L-i]~f[U-i]之间的最大值,这个可以用线段树来做,复杂度是O(∑size lo原创 2016-03-22 07:58:17 · 796 阅读 · 2 评论 -
【bzoj2599】[IOI2011]Race 点分治
点分治1、求树的重心2、计算以当前重心为根的子树的答案3、去掉以当前重心儿子为根的子树的答案4、枚举每个儿子,分治考虑计算过程如何实现我们不妨记一个ans数组,ans[i]表示使用i条边权值为k的有多少对每次实现2的时候,权值设为+1每次实现3的时候,权值设为-1把子树内所有的dis排序,计算有多少对权值和为k的,两个指针扫一遍就可以了。#i原创 2016-03-18 09:04:34 · 2357 阅读 · 2 评论 -
【bzoj3365】[Usaco2004 Feb]Distance Statistics 路程统计 点分治
点分治过程1、求出树的重心2、计算以当前根为根的对数3、计算以当前根的儿子为根的对数4、枚举每个儿子,分治每次递归每个儿子的时候,要把重心到儿子的边断掉,把儿子视为一颗新的树来做,于是就要重新构树。其实点分治题目的差别,主要在于calc函数是怎么写的,其他部分其实都是一样的难点在于要想办法把问题转化成支持减法的#include#include#i原创 2016-03-17 19:50:44 · 481 阅读 · 0 评论 -
【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分答案+树形dp+贪心
二分答案把原来的树分成S+1棵树,每棵树的直径小于等于ans贪心树形dp,计算一下每个点向下的最长链如果加上这棵子树就大于ans了,那么就割掉对于每个节点,把所有的子节点的最长链长度拿出来排序每次如果最长和次长相加>ans,那么就删掉最长复杂度O(nlog^2n)#include#include#include#include#include#原创 2016-02-24 19:00:56 · 856 阅读 · 0 评论 -
【bzoj3910】火车 LCA+并查集
不错的题。LCA+并查集每一个节点记录一个f[i]表示它到根的路径上第一个没经过的城市初始如果它是要访问的则f[i]=i,否则f[i]=fa[i]每次从一个点开始走到下一个点,求出LCA,计算出路径然后分别从两个点开始向上跳,直到深度小于LCA,把每次跳到的每个节点设置为访问过#include#include#include#include#includ原创 2016-02-24 14:14:14 · 604 阅读 · 0 评论 -
【bzoj4127】Abs 线段树+树链剖分
比较不错的题,因为每次都是加一个正数,所以每个数只会由负变正一次。每次变成正数的时候,暴力修改就可以了。维护一下区间最大的负数和负数的个数,如果这次没有负数变成正数,那么直接修改,否则暴力修改。#include#include#include#include#include#include#define maxn 100010 #define inf 100000原创 2016-01-18 14:52:08 · 446 阅读 · 0 评论 -
【bzoj3439】Kpm的MC密码 trie树+主席树
裸题,倒着建trie树,所有符合要求的串都在它的子树里,然后就是查询子树第k小了,用dfs序+主席树就可以了。#include#include#include#include#include#include#define maxn 300010using namespace std;int lch[maxn*20],rch[maxn*20],root[maxn],c原创 2015-11-25 18:02:41 · 1133 阅读 · 0 评论 -
【bzoj1912】 APIO2010patrol巡逻 树的直径
树的直径相关吧。首先k=1时,非常简单只需要在直径的两端连一条边。当k=2时,先在直径的两端连一条边,之后把直径上每条边边权变为-1,再求一遍直径,为什么呢?边权变成-1,等价于多走两遍。注意第二次不能用两次bfs,因为有负数边。#include#include#include#include#include#include#define maxn 1000原创 2015-10-27 10:52:29 · 686 阅读 · 0 评论 -
【bzoj1832】 AHOI2008聚会 lca
不错的题,就是找lca呗。因为三个点,所以一定在三个点连接的树枝上,那么先两个求个lca,第三个再走到这里就可以了。#include#include#include#include#include#include#define maxn 500010using namespace std;int next[2*maxn],to[2*maxn],head[maxn原创 2015-09-25 10:59:15 · 981 阅读 · 0 评论 -
【bzoj3732】 network 最小生成树+lca
水题,前几年的NOIP题目。先求出最小生成树,然后在树上求LCA就可以了,记得维护一下。结果调试输出忘删了。#include#include#include#include#include#include#define maxn 15010#define inf 1000000010using namespace std;struct yts{ int原创 2015-09-22 10:56:43 · 692 阅读 · 0 评论 -
【bzoj3306】 树 dfs序+线段树
并不是太难,只要处理换根操作就好了,因为这棵树的形态是不变的。那么按照点1为根时的dfs序,若当前根在x点的子树外,则答案还是x的子树,若当前根是x,那么答案是整棵树,若当前的根在x的子树内,则答案就是抠掉根所在的那一枝后的答案(画个图就明白了)。#include#include#include#include#include#include#define maxn 100原创 2015-08-17 13:23:27 · 659 阅读 · 0 评论 -
Codeforces Round #453 (Div. 1)解题报告(ABCD)
A.Hashing Trees题目大意:给定数组a[i],其中a[i]表示深度为i的节点有a[i]个,问是否存在两个不同构的树同时满足这个条件。如果有,请输出。 简要题解:有很多种构造方案。我的做法是,第一次把所有深度为i的节点都向深度为i-1的第一个节点连边。第二次,尝试分出一个深度为i的节点向深度为i-1的第二个节点连边。如果可以这样生成两棵树,则有解。#include<cstdio>#in原创 2017-12-21 13:50:51 · 523 阅读 · 0 评论