树形数据结构
luoyuef
这个作者很懒,什么都没留下…
展开
-
[AHOI2009]维护序列
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。 输入格式: 第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依原创 2017-11-10 09:03:00 · 372 阅读 · 0 评论 -
[ZJOI2006]书架
题目 平衡树裸题。。按层数随便赋个值表示相对关系,然后查找排名就好了。(我依然调一年)…然而这题线段树做法比较有趣。 空间开足够对于每次top和bot操作要新开空间。数组记录编号为s的书在线段树上的位置。 线段树上维护那段区间有没有书。 然后对于top和bot操作。。二分一直跳到没有书的第一个为0的点。对于ins操作。交换相邻点。 ask查询区间和(前缀)。 query二分一直找到原创 2018-01-18 15:09:01 · 241 阅读 · 0 评论 -
雨天的尾巴
N个点,形成一个树状结构。有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成 所有发放后,每个点存放最多的是哪种物品。 Input 第一行数字N,M 接下来N-1行,每行两个数字a,b,表示a与b间有一条边 再接下来M行,每行三个数字x,y,z.如题 Output 输出有N行 每i行的数字表示第i个点存放最多的物品是哪一种,如果有 多原创 2018-01-18 14:58:59 · 179 阅读 · 0 评论 -
一些根本不用数据结构的题。。(积木大赛、焚风现象)
我发现我学数据结构学傻啦。。看题和数据范围就会想到些数据结构。。。春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第原创 2018-01-16 21:07:57 · 294 阅读 · 0 评论 -
火柴排队
涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果原创 2018-01-16 15:01:15 · 326 阅读 · 0 评论 -
Qtree3
给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出-1方法1:树剖线段树上维护深度最小的黑点。 方法2:统计点到根的路径有几个黑点,倍增向上跳。#includeusing namespace std;const int MAXN=1e5+原创 2018-01-15 16:59:30 · 748 阅读 · 0 评论 -
Qtree1
给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0边权转化点权,然后就是树剖模板。 转成点权后。。。如果查询区间是同一点答案为0,在一条重链上时相当于查询上面那个点的重儿子到下面点。#include<bits/stdc++.h>using namespace std;#defin原创 2018-01-15 16:57:05 · 351 阅读 · 0 评论 -
可持久化线段树(主席树)学习笔记(1)
集训学了些妙妙的数据结构和晕晕的知识(线性基)。qaq代码里注释解释的很清楚了。。再详细的见: 传送门静态区间第K大离散化不去重主席树模板#include<bits/stdc++.h>using namespace std;const int MAXN=2e5+5;int n,m;struct node{ int l,r,sum;}T[MAXN*60];struct A{ i原创 2017-11-27 20:16:28 · 195 阅读 · 1 评论 -
点分治学习笔记(1)
给定一棵有n个点的树 询问树上距离为k的点对是否存在。 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出格式: 对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号)朴素的想法就是直接去枚举。但我们可以发现(我发现不了)。 对于一个点 显然只有经过他的路径和不经过他的路径。 我们不考虑不过他的路径。原创 2017-12-06 11:48:06 · 215 阅读 · 0 评论 -
NOI2015 软件包管理器
题目描述Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。你决定设原创 2017-11-26 18:52:44 · 265 阅读 · 0 评论 -
数列
数列 【题目描述】 一个序列有 N 个数,最初每个数均为正无穷大。一共进行 Q 次事件。事件有两种类型: 1. ‘M’ X A 将第 A 个数修改为 X; 2. ‘D’ Y B 查询当前从 B 到 N 的第一个小于或等于 Y 的数的位置,无解返回-1。 已知每个数最多被修改一次(即,数据中所有 1 类事件的 A 互不相同)。 【输入 格式】 输入文件名为 deda.in。 第一行,两原创 2017-11-26 16:50:28 · 213 阅读 · 0 评论 -
NOIP 2016 天天爱跑步
天天爱跑步这道题。有点丧心病狂。。为什么会出现在NOIP里呢。。。先讲部分分: 对于前25分 瞎暴力即可。 对于Si=1的20分: 我们发现Si=1时,对于在点i的观察员。 深度为dep[i],出现时间为w[i]。因为所有的点都是由上到下的,所以只有S在上面时才会对点i贡献。 会对i造成贡献的点S: dep[i]-w[i]=dep[S]。而所有的点S都为1。 得到恒等式:dep[i]-w原创 2017-12-21 17:03:49 · 292 阅读 · 0 评论 -
平衡树:treap学习笔记(2)
上一次写了旋转的treap(代码非常简单。 这次我们来写无旋的treap。这个treap没有旋转操作。 有两个基本操作:合并、分裂。 插入和删除时都使用到了这两个操作,感觉很妙呀qaq。 具体的解释详见:https://wenku.baidu.com/view/09fbf8147c1cfad6195fa7f0.html; 还有zcy的代码:https://www.cnblogs.com/z原创 2017-11-20 11:33:48 · 228 阅读 · 0 评论 -
平衡树:treap学习笔记(1)
平衡树是基于二叉查找树的一个数据结构。他的左右子树高度差不超过1。 下面我先扔出我treap的奇怪的代码,然后明天再来更新qaq。#include<bits/stdc++.h>using namespace std;const int MAXN=2e5+5;int my_rand(){ static int seed=623; return seed=int(seed*48271原创 2017-11-16 21:10:20 · 247 阅读 · 0 评论 -
平衡树:treap学习笔记(3)
在(2)中我们写了无旋treap。然后我就找到了那道题qaq。文艺平衡树 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,由1-n组成 m表示翻转操作次数。 输出格式: 输出一原创 2017-11-20 16:43:34 · 245 阅读 · 0 评论 -
树链剖分学习笔记
Q:什么是树链剖分? A:在一棵树上,划分轻重链来维护树上的区间(语言表达能力极差所以我决定复制一段过来在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。 树链剖分有几个操作,dfs1预处理出每个节点的size(质量,以i为根的节点有多少孩子原创 2017-11-15 13:23:11 · 305 阅读 · 1 评论 -
LCA总结
1:倍增。预处理出x上面的2的i次方祖先。找的时候调到同一高度往上跳。无限逼近#include<bits/stdc++.h>using namespace std;const int MAXN=5e5+5;int head[MAXN],cnt=0;struct edge{ int to,next;}e[MAXN<<1];struct bz{ int dep[MAXN],anc[M原创 2017-11-05 19:54:22 · 177 阅读 · 0 评论 -
灾后重建及变式
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的。并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[原创 2017-11-03 12:12:14 · 291 阅读 · 0 评论 -
[COCI2017-2018#2] Garaža
维护一个nnn个数的序列支持两个操作。 1. Change the value at positionXXX in the sequence to VVV 2. Determine the number of interesting contiguous subarrays contained in the interval [L,...原创 2018-04-18 11:52:26 · 434 阅读 · 0 评论