===数据结构===
文章平均质量分 70
wJs9528-1
这个作者很懒,什么都没留下…
展开
-
BZOJ 4034 T2 (树链剖分解决子树问题)
树链剖分有这样一个性质,即在剖完之后每个结点下面子树的编号一定是连续的,那么基于这一点,我们记录每个结点的区间就能解决子树更新问题dfs序也可以解决子树问题,但是这里需要计算一个贡献值,结点的层数不好处理。#include#include#include#includeusing namespace std;#define maxn 200004int fir原创 2016-08-01 08:33:44 · 1159 阅读 · 0 评论 -
曼哈顿距离最小生成树
转载于http://blog.csdn.net/ACM_cxlove?viewmode=contents 二维平面中有一些点,两点之间的距离为曼哈顿距离,求最小生成树。朴素的n个点,只能做到O(n^3)或者O(n^2 lgn)。但是针对这种曼哈顿距离的MST。其中有个性质是:对于某个点,以他为中心的区域分为8个象限,对于每一个象限,只会取距离最近的一个点连边。这样的话,转载 2016-08-06 18:17:22 · 490 阅读 · 0 评论 -
树链剖分小结及题目
我们经常会遇到这样一类题目:给出一棵树,询问树上u,v两点路径间的最值,合值,更新u,v路径上的点权或边权,或者区间更新etc,此时如果单纯的用线段树或者树状数组去搞,很明显问题不能够得到完美解决,此时就需要更高级的数据结构去对树进行重新构造,也就是通常说的树链剖分。一.树链剖分树链剖分,顾名思义,也就是对树的每一条链进行剖分,将一棵树拆分成若干条链,对其进行重新编号,在进行了重新编原创 2016-08-04 10:28:22 · 3710 阅读 · 0 评论 -
SPOJ DQUERY (主席树模板)
题意:给出一个序列,询问区间内有多少个不同的数这题卡分块莫队,写了一下主席树,已加入模板主席树大概是这么回事,每个结点记录前缀线段树,当然这里的线段树结点的申请是动态的,每次最多申请logn个,对于询问来说就只需要询问前缀r线段树中l到n区间内不同数的个数了#include#include#include#include#includeusing nam原创 2016-08-08 15:32:43 · 1565 阅读 · 0 评论 -
SPOJ COT Count on a tree (树上k大 主席树模板)
题意: 给出一棵树和树上结点的权值,询问u->v路径上结点第k小权值首先考虑一维序列上第k小是主席树如何处理的,主席树在每个结点存储的是当前结点及前面所有结点权值的线段树,当需要询问k小时,只需要取出左端点记录的线段树版本和右端点记录的线段树版本,然后二分去查找k小即可 现在考虑一棵树上如何操作,如果是一条链,那么和一位序列处理的方法一样,那么此时每个结点存储的就是当点结点和父链所有结点的信息,原创 2016-08-10 10:49:09 · 341 阅读 · 0 评论 -
CodeForces 707D Persistent Bookcase (操作建树DFS|主席树+主席树)
题意: 给出一个n*m的书柜,有四种操作 1 i j — Place a book at position j at shelf i if there is no book at it. 在i行j列放一本书,如果已有书则不放 2 i j — Remove the book from position j at shelf i if there is a boo原创 2016-08-22 14:02:35 · 694 阅读 · 0 评论 -
BZOJ 3295: [Cqoi2011]动态逆序对 (树状数组套主席树)
题面: 对于序列A,它的逆序对数定义为满足i<ji<j,且Ai>AjAi>Aj的数对(i,j)(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。对于已经存在的序列进行删除不是很好操作,不妨先倒过来想,假设我们将这些数空缺,然后倒序加入序列中是否可行,很明显可以,那么剩下的问题就是对于当前加入的书产生了多少个逆序对,对于新添入原创 2016-08-22 16:44:33 · 922 阅读 · 0 评论 -
HDU 5869 Different GCD Subarray Query(计数区间不同GCD)
题意:给出一个序列,m次询问,每次询问某个闭区间内所有的子区间组成的不同GCD有多少个对于一个长度为n的序列来说,组成的不同GCD值不会超过n*logn个,所对应的区间也是如此,预处理出每个下标对应的所有不同gcd区间,右端点排序,对询问离线处理,右端点排序,通过树状数组计数不同的gcd值得到答案#include<cstring>#include<string>#include<iostream原创 2016-09-13 11:44:23 · 528 阅读 · 0 评论 -
CodeForces 208E Blood Cousins(树剖求lca + dfs序)
题意: 给出若干棵树,q次询问,每次询问某结点n向上k步的父节点的子树中有多少个和n是兄弟结点(深度相同) ps:这里的题意是将问题简化过后的 假设现在只有一棵树,首先考虑结点的子树如何确定,dfs序可以解决,再考虑向上k步的lca如何解决,倍增法求lca(弱不会),由于只会树剖向上爬,外加上树剖可以直接处理dfs序,所以就写树剖了…对于子树内符合条件的结点,只需要开10510^5个深度的ve原创 2016-09-02 10:31:21 · 531 阅读 · 0 评论 -
HDU 4348 SPOJ TTM To the moon(操作建树)
题意:给出一个序列,四种操作C l r d: Adding a constant d for every {Ai | l <= i <= r}, and increase the timestamp by 1, this is the only operation that will cause the timestamp increase. Q l r: Querying the current原创 2016-08-24 14:21:10 · 435 阅读 · 0 评论 -
BZOJ 3531 (树链剖分,线段树动态开点)
首先读完题,仔细观察一下,如果按照常规写法,那么对于每一个宗教来说都应该储存当前宗教下所有城市的评价,即建立C棵线段树去维护宗教下的所有城市,但是这里如果直接开数组维护很明显会爆内存,观察到由于每个宗教来说并不是所有城市都为有效值,而只是部分城市,考虑到这一点,可以选择动态的在线段树上开结点去维护城市评价。对于动态开结点的操作,我是这么处理的,首先开一个大数组表示结点,前100000个表示宗教原创 2016-08-02 21:27:31 · 1004 阅读 · 0 评论 -
1086: [SCOI2005]王室联邦 (树分块)
树分块原则:让尽量多的结点分块时分在一起,由一个父节点连接属性相同的块,多余的结点补到最后的块中#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algorithm>#include<map>#include<cstdlib>#include<cmath原创 2016-08-06 10:08:56 · 506 阅读 · 0 评论 -
HDU 5029 Relief grain(恶心的树链剖分 + 线段树)
题意:n个村庄分配粮食,m次分配,每一次分配树上的l~r区间村庄内某种粮食*1,询问每个村庄最多粮食数量的种类是什么分析:首先注意到题目要求在树上的路径分配粮食,很容易想到用树链剖分和线段树去处理区间查找过程如果此时强行将每个区间内的粮食数量及种类全部存下来,很明显内存会爆掉,试过了。。。此处则行不通,也是关键要解决的问题稍微观察一下,注意到没有更新操作,完全可以离原创 2016-07-20 19:36:45 · 597 阅读 · 0 评论 -
HDU 4718 The LCIS on the Tree (树链剖分 + 线段树区间合并)
题意:给出一棵树,树上的每个点有权值,m次询问从u到v两点路径上最大的LCIS值是多少分析:熟练剖分解决两点路径的移动问题关键还是在于线段树的区间合并和爬树时的区间方向问题我是这么处理这个过程的,对于每个区间,记录每个区间的 Lval(左端点值),Rva(右端点值),LL(以左端点为起点的下降最大LCIS值),LR(以左端点为起点的上升最大LCIS值),RL(同上),RR(同上原创 2016-08-01 20:44:13 · 895 阅读 · 0 评论 -
HDU 5052 Yaoge’s maximum profit (树链剖分 + 线段树)
题意:简单来说,就是求树上从s到t点之间的所有点中后面某点的权值减去前面某点的权值最大差值分析:读完题马上看到树上两点路径就能想到是树链剖分去处理(不会LCT,只好写树剖了T_T),外加线段树区间合并,区间更新去处理权值的更新,关键是查询部分,由于每次查询的两点是有方向的,所以这里需要用一个标记,标记我在向上爬点的时候是从哪个方向到哪个方向,然后再处理结果,细节比较多,重写了一边才过原创 2016-07-22 11:04:43 · 715 阅读 · 0 评论 -
HDU 3801 Query on a tree(树链剖分离线处理)
题意:给出一棵树,询问从x点到1点路径上小于等于y的最大值分析:建一棵空树,离线处理更新边权和答案#include#include#include#include#include#include#include#include#include#include#pragma comment(linker, "/STACK:1024000000,102400原创 2016-08-02 09:16:21 · 545 阅读 · 0 评论 -
NBUT 1457 Sona (莫队算法)
题意:给出一个数列,求区间内相同数字次数的三次方和分析:离散化数字之后直接莫队#include#include#include#include#include#include#include#include#include#include//#pragma comment(linker, "/STACK:1024000000,1024000000");原创 2016-08-05 15:36:03 · 317 阅读 · 0 评论 -
初学伸展树区间建树(A Simple Problem with Integers)
一.几个重要概念1.伸展树属于一种平衡树,也是一棵普通的二叉排序树。2.伸展树的核心在于它的伸展(splay)操作,对于每一次的伸展操作(把某个节点放到目标节点的下面),都有可能改变树中每个节点的分布,从而改变整个树的形状。3.伸展树对于树的平横性没有要求,与平衡树不同,任意两个节点都可以有任意的深度差,不需要记录平衡树的冗余信息。4.伸展树每次搜索的复杂度平摊下来都是log(原创 2016-02-21 11:27:25 · 572 阅读 · 0 评论 -
HDU 5792 World is Exploding (树状数组逆序对)
World is ExplodingProblem DescriptionGiven a sequence A with length n,count how many quadruple (a,b,c,d) satisfies:a≠b≠c≠d,1≤ab≤n,1≤cd≤n,AaAb,Ac>Ad. InputThe input consists of multiple原创 2016-08-02 20:03:01 · 443 阅读 · 0 评论 -
HYSBZ 2038 小Z的袜子(hose) (莫队算法)
简单说一下莫队算法的复杂度,莫队算法其实是在区间的进退处理上进行了一个优化,大大降低复杂度,首先是区间的分块处理,将数据分为n√\sqrt{n}个块,考虑左边界的移动情况,由于每个块中每个询问左边界最多移动n√\sqrt{n}步,所以左边界的复杂度为mn√m\sqrt{n},再考虑右边界的移动情况,由于块中右边界保持升序,所以一个块中右边界的移动复杂度为n√\sqrt{n},考虑块与块之间的移动情况原创 2016-08-05 21:48:36 · 366 阅读 · 0 评论 -
codeforces 466C C. Number of Ways
题意:给出一个序列,求出这个序列切成三段相同值的方案数首先sum值一定整除3,否则方案数为0,接着预处理出sum/3和sum/3*2的下标,再扫一遍就能得到答案#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algorithm>#include<map>原创 2016-09-14 19:14:33 · 536 阅读 · 0 评论 -
codeforces 276 C. Little Girl and Maximum Sum
题意:给出一个长度为n的数列,m次询问区间合值,现在要求把数列重新排序使m次询问合值累加最大其实就是某个位置上次数越多使得乘积的数越大,贪心一下,树状数组或者线段树随便搞搞,统计每个位置的询问次数,将次数和原数列从大到小排,依次乘积相加#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstd原创 2016-09-16 10:49:41 · 394 阅读 · 0 评论 -
CodeForces 455D Serega and Fun (分块+双端队列)
题意:给出一个序列,两种操作 1.将区间[l,r]滚动一次 2.询问区间[l,r]中值等于k的数有多少个 在线分块之后,两种操作都能在sqrt(n)的复杂度内解决,将每个块都设置为队列,这样滚动起来非常方便一开始没有看到数值的范围,直接用的分块+bitset+双端队列,结果T了,后来看到了这一点,想写个分块+循环队列,结果发现编程复杂度太高..(好菜)…最终还是分块+双端队列…#include原创 2016-10-12 11:35:11 · 1665 阅读 · 0 评论 -
CDOJ 1324 (分块样例)
简化题意: 单点更新某个值,区间查询最大值分块:首先将序列分成sqrt(n)sqrt(n)块,每个块中有sqrt(n)sqrt(n)个元素,更新O1O1,查询O(sqrt(n))O(sqrt(n))#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algor原创 2016-09-28 18:33:19 · 361 阅读 · 0 评论 -
CodeForces 13E Holes(分块)
题意: 有n个洞,每个洞有一个power值,表示进入这个洞的球能够被弹到i+power处,两种操作 1.将a洞的power改为b 2.询问从洞a开始放一个球,能被弹出的次数和最终位置题解: 分块处理,每个块中处理每个点被弹出这个块的位置和次数。 调整了一下块的大小,优化了500ms+#include<cstring>#include<string>#include<iostream>原创 2016-10-14 18:10:58 · 593 阅读 · 0 评论 -
CodeForces 551E GukiZ and GukiZiana (分块)
题意: 给出一个序列,两种操作 1.将区间[l,r]上的数加x 2.询问满足a[i]=x的下标中下标最大距离,即找到序列右边值等于x的下标和左边等于x的下标,输出差值,如果没有找到,输出-1 题解: 二分,妥妥的#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#in原创 2016-10-14 18:59:20 · 382 阅读 · 0 评论 -
HDU 4123 (树的直径+单调队列求差值小于等于k的最长子区间)
题意:给出一棵树,结点编号1~n,设每个结点到树上最远距离为Li,m次询问每次询问1~n中连续区间中差值小于等于q的最长子区间长度 题解:首先肯定是要用树的直径处理出每个结点的最远距离,接下来就直接O(n*m)吧,试过不会T,每次询问都扫一遍整个数组得到最长子区间。 最长子区间求法可以单调队列,也可以用RMQ预处理#include<cstring>#include<string>#inclu原创 2016-11-08 21:24:25 · 560 阅读 · 0 评论 -
HDU 5919 Sequence II(主席树)
题意:给出一个长度为n的序列,m次询问,每次询问取出【l,r】区间内所有第一次出现的数字下标,输出这些下标的中位数,强制在线分析:由于需要强制在线处理,并且没有修改,所以考虑用主席树,统计第一次出现的数字下标,直接倒着扫一遍数组建树,每一次询问,统计区间个数,二分查找第k个数,复杂度mlog(n)mlog(n)#include<cstring>#include<string>#include<i原创 2016-10-07 10:06:30 · 368 阅读 · 0 评论 -
UESTC 1292 卿学姐种花 (分块)
题意:给出一个长度为n的序列,m次操作,操作分为两种: 1.在x的位置上加上数y,在x+1的位置加上数y-1,以此类推,一直到n或者y为0. 2.询问x位置上数字为多少分析:乍一看像是线段树,但是貌似又很难用线段树解决,主要是区间不好处理,而分块对于这类题目有优势,在区间上更容易计数,对于每个块,对于1操作,如果某个块全覆盖,记录两个值,增值和差值,通过加加减减就能得到答案,如果不是全覆盖直接s原创 2016-10-07 23:28:59 · 359 阅读 · 0 评论 -
HDU 4777 Rabbit Kingdom(离线树状数组 预处理)
题意:询问区间内与其它数不互质的数有多少个 题解:看了众多大牛的博客才懂这题怎么写(我好菜啊) 对于每一次询问,如果知道了这个数的左边不互质区间和右边不互质区间,那么就能通过离线之后加加减减的方法得到答案。 1.不互质区间处理:对于整个序列,从左扫一遍,再从右扫一遍,扫的时候记录每个数的素因子出现的位置,不断更新素因子位置得到每个数的不互质区间L,RL,R; 2.离线处理答案:对于所有询问离原创 2016-10-30 17:41:06 · 347 阅读 · 0 评论 -
HDU 4046 Panda (分块 或 线段树区间合并)
题面挺美的 题意:给出一个字符串,两种操作1.询问区间[l,r]内wbw有多少个(可重叠)2.将位置x的字符改为c 题解:分块和线段树都可以搞,分块很好解释,只需要单独处理边界问题。线段树区间合并需要将每次询问的区间拿出来单独处理一次。分块:#include<cstring>#include<string>#include<iostream>#include<queue>#include原创 2016-10-31 22:52:43 · 396 阅读 · 0 评论 -
BZOJ 2957 楼房重建 (分块)
很容易观察到其实就是在找斜率的最长上升序列,分块之后直接处理斜率,怕有精度误差所以用的乘法做判断小于关系,加了一点小优化卡过去了 直接用double表示斜率貌似也可过/************************************************************** Problem: 2957 User: wsa Language: C++原创 2016-10-10 18:36:29 · 684 阅读 · 0 评论 -
hihocoder #1383 : The Book List(类字典树建树)
http://hihocoder.com/problemset/problem/1383题意:给出一些文件目录,要求把目录还原,字典序输出类似字典树的建树方法,最多3000个结点,3000个叶子,对于每条输入记录,把字符串映射成结点,标记叶子,由于需要先输出有子目录的,所以先dfs一下记录siz,对于字典序,我是这么处理的,用一个vector存每个结点的字符串,直接对字符串排序,每次dfs直接mp找原创 2016-09-24 21:39:27 · 453 阅读 · 0 评论 -
codeforces 696 A. Lorenzo Von Matterhorn
题意: 给出一棵二叉树,结点i和结点2*i,2*i+1相连,q次操作 操作1:将u->v路径上的权值加上c 操作2:询问u->v路径上权值和分析: 乍一看以为是什么高级数据结构,然而仔细分析以下题目,其实并不是,根据二叉树的特性,结点i除以2就可以得到它的父节点,那么每次操作只需要u和v除2一直到u=v就能够得到这条路径,在路径上记录权值就不成问题了,由于结点范围较大,所以我用的map存#i原创 2016-09-16 23:04:49 · 420 阅读 · 0 评论 -
codeforces 713 A. Sonya and Queries
题意: 有一个整数多重集合,对这个集合有三种操作: 1.+ a 在集合里面添加一个元素a 2.- a 在集合里面减少一个元素a 3.? x 询问集合里面满足条件a的元素有多少个 其中x仅由0,1组成1代表这个位置上一定为奇数,0代表为偶数,长度不相等补0分析: 仔细想想其实询问与数字是多少没有关系,而是和位置上的奇偶有关,那么假设奇数为1,偶数为0,那么每个数字就映射成了一个二进制数,接原创 2016-09-16 23:12:34 · 147 阅读 · 0 评论 -
HDU 5884 Sort (哈夫曼全树+队列优化)
题意:给出一个序列,要求构成k进制的哈夫曼编码,使得k最小并且合并花费不超过T注意事项: 1.哈夫曼树一定要构成全树再去求花费 2.优先队列优化,最坏情况 n/2log(n/2)n/2log(n/2)#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<alg原创 2016-09-17 22:28:49 · 468 阅读 · 0 评论 -
HDU 5886 Tower Defence (最长链预处理)
题意:给出一棵树,边上有权值,现在毁掉任意一条边,分成两部分,求这两部分中最远的两点距离期望,答案*(n-1)分析: 说白了就是求最远距离加成和 对于一棵树来说,两点最远的距离,考虑两点: 1.最长链没有被拆开,那么答案就是最长链; 2.最长链被拆开了,那么答案一定在最长链的端点到某个叶子结点上; 证明略。有了这个结论,这个题就好做了,首先预处理出最长链,数组存下来,然后对于每个最长链上的原创 2016-09-18 10:22:15 · 987 阅读 · 0 评论 -
HDU 5649 DZY Loves Sorting(线段树+二分)
题意:给出一个序列,m次[L,R]区间的原地排序,最后只有一次询问下标为k的值为多少题解:二分求解答案,对于数m,比它大的置为1,比它小的置为0,线段树处理排序过程,复杂度(n+m)∗log2(n)(n+m)*log^2(n)#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#原创 2016-09-19 21:24:36 · 381 阅读 · 0 评论 -
HDU 4858 项目管理(点分块)
题意:给出一张图,两种操作 1.将点x加上权值y 2.询问与点x相邻点的权值和分析:将点分为重点和轻点,度数大于等于sqrt(m)sqrt(m)为重点,小于的为轻点,将重点和相邻重点连边,轻边和相邻所有边连边,得到规律,重点的答案是由周围重点和轻点对它的加成组成,而轻点答案直接由相邻点组成,复杂度 O(q∗sqrt(m))O(q*sqrt(m))#include<cstring>#includ原创 2016-10-09 17:29:22 · 651 阅读 · 0 评论 -
CDOJ 1157 数列(seq) (分块)
题意:给出一个数列,两种操作 1.修改操作:把数列中第i个数改为x 2.询问操作:给定一个位置i,问数列中有多少个位置j ( j>i ),满足位置i与位置j间所有的数都不超过Ai与Aj的较大值。简单来说,操作2分为两部分 1.位置i右边相邻连续的比它小的数字个数 2.位置i右边不减序列长度 直接将数列分块,分块暴力维护和求解答案 第一部分询问做法:记录块中最大值为多少,如果整个块中值小于原创 2016-10-09 17:37:50 · 596 阅读 · 0 评论