
树链剖分
Zhayan9QvQ
嘿嘿嘿
展开
-
【Bzoj2819】Nim
题意给定一棵树,两个操作: 1.询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略。 2.把堆v中的石子数变为k。作为一个解[ka]决[guo]了这道题的人,来分[kou]析[hu]一下算法,其实正解是Dfs序之后树状数组,但是因为懒就直接写了树剖,每个区间维护区间的异或值。因为异或的性质a^b^c=a^(b^c)。然后Nim游戏有必胜策略,当且仅当所有堆的石子异或起来不等于0,之后原创 2017-03-17 20:40:58 · 419 阅读 · 0 评论 -
【Bzoj4336】骑士的旅行
题意给一棵树,每个结点上可能有多个权值,可以每次改变某权值的值或者位置,多次询问一条路径上的前k大值。解析对于每个结点维护一个multiset,因为k很小,所以每次可以把两结点暴力合并,这样就只要把两个队列合并就可以了。#include <set> #include <cstdio> #include <algorithm>#define Rep( i , _begin , _end ) for(i原创 2017-06-24 22:40:19 · 867 阅读 · 0 评论 -
【Bzoj3732】Network
题意给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).现在有 K个询问 (1 < = K < = 20,000)。 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?解析类似于那啥货车运输,嗯原创 2017-07-01 19:11:39 · 756 阅读 · 0 评论 -
【Bzoj4353】play with tree
题意给你一棵包含N个节点的树,设每条边一开始的边权为0,现在有两种操作: 1)给出参数U,V,C,表示把U与V之间的路径上的边权变成C(保证C≥0) 2)给出参数U,V,C,表示把U与V之间的路径上的边权加上C。但是如果U至V之间路径某条边的边权加上C小于0,那么C=这条边的边权的相反数。 你需要统计出每次一操作过后树中边权为0的边有多少条。解析边权树链剖分。对于操作1直接修改,对于操作2,先原创 2017-07-01 16:15:30 · 906 阅读 · 0 评论 -
【Bzoj4448】情报传递
题意给一棵树和m个操作(持续m秒),操作如下 1.给一个点打上标记,被标记的点每秒加1危险度,(被标记时仍为0,后一秒为1)。 2.查询x,y的路径上有多少危险度大于k的点。解析这种每秒增加的标记显然是不好维护的。 考虑转化。 设某点在t时刻被标记,i时刻提出询问,那么此时它的危险度为i-t。 则有i-t>k,t#include <cstdio> #include <algorithm>#原创 2017-06-20 20:40:08 · 731 阅读 · 0 评论 -
【Bzoj2243】染色
题意给定一棵有n个节点的无根树和m个操作,操作有2类:1、将节点a到节点b路径上所有点都染成颜色c;2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。请你写一个程序依次完成这m个操作。应该是我太水了来着…?打了一小时调了一天,主要就是注意合并时判断中间部分的端点颜色,如果一样的话统计时就要减1。然后在get函数中也一样原创 2017-03-16 21:41:08 · 399 阅读 · 0 评论 -
【Bzoj4196】软件包管理器
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。ebian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。原创 2017-03-16 14:30:09 · 481 阅读 · 0 评论 -
【Bzoj1036】树的统计
题意一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对棵树完成一些操作:1.把结点u的权值改为t2.询问从点u到点v的路径上的节点的最大权值3.询问从点u到点v的路径上的节点的权值和注意:从点u到点v的路径上的节点包括u和v本身一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对棵树完成 一些操作: 1.把结点u的权值原创 2017-03-12 15:57:14 · 308 阅读 · 0 评论 -
树链剖分总结
树链剖分….等等等等 这是题目总结,反正就是把各种水题放到一起。然后数组意义的话,dpt深度,son重儿子,ftr父亲,rnk线段树中编号,size是子树大小,top是重链顶端的结点。【Bzoj1036】树的统计比较裸,维护区间和与最大值就好了。【Bzoj4034】树上操作也是模板,对于子树只要记一个end[x]就行了。【Bzoj4396】软件包管理器安装操作就是将软件包到根全都赋为1,然后输出改原创 2017-03-26 09:54:13 · 386 阅读 · 0 评论 -
【Bzoj4034】树上操作
题意 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 -----------------------------------------------------原创 2017-03-16 14:24:28 · 639 阅读 · 0 评论 -
【Bzoj3626】LCA
题意给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。 有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)]。 (即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和)解析 首先发现一个性质,加上depth[LCA(原创 2017-03-24 20:53:42 · 512 阅读 · 0 评论 -
【Bzoj3531】旅行
题意:有n个城市,每个城市有权值和颜色,支持的操作有单点修改权值,单点修改颜色,查询区间同颜色之和,查询区间同颜色最大值。 思路:对于每种颜色,放入不同的线段树,但其实整个加起来还是还是n个结点,值得注意的是,这里要使用动态开点,要一步步记录左右儿子的编号,而不能使用2i,2i+1直接去找,而这样建树的话,就可以很方便的查询同颜色的结点了,修改操作啥的把原颜色中的结点改为0,再在现在的颜原创 2017-03-19 15:43:18 · 437 阅读 · 0 评论 -
【Bzoj3083】遥远的国度
题意给定一棵有根树,支持3种操作: 1.把首都修改为id; 2.将p1 p2路径上的所有城市的防御值修改为v; 3.询问以城市id为根的子树中的最小防御值。分析画了一堆图之后终于搞懂了一点点,首先换根的话肯定不是真的换。对于每次询问,设现在的根为root,准备询问的结点为x。来考虑几种情况。 1.root == x ,询问整棵树,直接输出全集。 2.root不为x的子树,则直接考虑x的整棵原创 2017-03-17 22:39:45 · 447 阅读 · 0 评论 -
【Bzoj2588】Count on a tree
题意伟大的树上权值第k小。解析在树上建立主席树,每个点的前驱不再是它的前一个点,而是它的父亲结点。我们可以这样来想,序列上的主席树类似于前缀和,用的时候直接序列上差分。而树上也就可以把每个点保存为到根的主席树,查询的时候也类比树上的差分就可以了。记得是Query(rt[x],rt[y]….)。#include <cstdio> #include <algorithm>#define Rep( i ,原创 2017-07-06 11:51:50 · 741 阅读 · 0 评论