数据结构
asdfgh0308
这个作者很懒,什么都没留下…
展开
-
hdu 4967 Handling the Past 线段树,最右正值区间
最后一场多校,又被吊打。最近学了一些莫名其妙的算法,然而最简单的线段树都写不好。(政神1小时秒杀的题目我改了4小时。)还是静下心来,学好用好每一种算法。hdu 4967 Handling the Past 看了题解。很巧妙的做法。利用线段树记录一个值rmax=max{左儿子的rmax+右儿子的sum,右儿子的rmax}。通过这个值可以快速找到 总和为正值的最右位置。原创 2014-08-22 11:48:11 · 1282 阅读 · 0 评论 -
hdu1754 I Hate It,线段树
简单的线段树,求区间最大值和修改某个点的值。#include#include#includeusing namespace std;#define N 200100#define ls (p<<1)#define rs (p<<1|1)#define mid(p) (t[p].l+t[p].r>>1)int v[N];struct segment原创 2015-01-06 11:21:44 · 621 阅读 · 0 评论 -
poj2528 Mayor's posters,线段树,离散化
线段树+离散化。离散化的时候要记得将端点的左边一个点和右边一个点也加进去,不然是错的。也有不用线段树的做法,例如用个堆,参考这篇点这里。#include#include#include#includeusing namespace std;#define N 60100#define ls (p<<1)#define rs (p<<1|1)#define mid(p) (t原创 2015-01-06 10:18:25 · 636 阅读 · 0 评论 -
hdu 4670 Cube number on a tree,平衡树,启发式合并
又找到一个启发式合并的练手题。还不太清楚这种算法的可以先看看这篇。这题问的是有多少个路径满足路径的乘积是立方数。其实分解质因数后,用一个long long保存状态,这样就变成了多少条路径满足路径的状态和等于0。在树的每个节点建一个平衡树,自下而上合并时统计,很容易得到这个结果。貌似在相同复杂度的情况下,启发式合并的效果都要比点分治的效果要好(常数要小)。不过调试原创 2014-11-07 01:25:18 · 835 阅读 · 0 评论 -
hdu 4680 splay,启发式合并
hdu 4680 splay,启发式合并这个题是按照权值建树,一般的区间树操作可能得修改一下。几个操作也很有想法:1.合并两个集合。这里用到启发式合并的方式,也就是把小的集合一个个插到大的上,可以证明合并操作不会超过O(nlogn)2.拔、插。这是splay的基础不用说了。3.改。因为是权值建树,不能直接改。先拔出来改了再插回去。4.这个很巧妙,取最多的点最优的方式原创 2014-11-06 21:17:50 · 1463 阅读 · 0 评论 -
hdu4601 Letter Tree,trie,bfs,dfs,二分,rmq
真的是很有意思的题。因为有重复的边,我想了很多贪心搞法都错了。最后还是看了标解。trie+bfs+dfs+二分+rmq。OMG最重要的还是几点吧:1.通过在trie上dfs/bfs可以知道某个节点的hash值大小,因为有mod,直接比较值是没法比较大小的。2.bfs可以将树上同一深度的点放在一个连续区间,而dfs可以求出子树区间,结合就能找到子树中某个深度的最值。注原创 2014-11-01 21:05:24 · 527 阅读 · 0 评论 -
hdu4812 D Tree,平衡树,启发式合并
今天模拟2013南京赛,两个半小时做完5题开始梦游。每次都出不了难题有木有!都是水题的场手速又拼不过有木有!hdu4812 D Tree,南京的k题。每个点有一个权值,问是否存在一条路径,路径所有点的权值乘积模1e6+3等于k。这个题,大家基本都是用点分治过的,复杂度O(nlogn)。这里介绍一个有趣的解法,也是一个我感觉很有用的思想:启发式合并。先说说启发原创 2014-10-05 00:48:03 · 1596 阅读 · 0 评论 -
poj2528 Mayor's posters,优先队列
poj2528 Mayor's posters,优先队列给你一些海报,贴在墙上的顺序,问最后可见的有几张。墙可以看成一个线段,没有高度。这种问题当然线段树可以解决。区间更新。最后扫一遍有几种。但是这种离线的区间问题,用左进右出的做法更简单。这里用到一个堆/优先队列。连离散化都不用,排个序即可。每条线段化为两个点,左端点和右端点+1。排序一下这些点。还是从左往右扫原创 2014-10-14 17:49:22 · 901 阅读 · 11 评论 -
hdu4605 Magic Ball Game,函数式线段树
hdu4605 Magic Ball Game求某点到根的路径的blabla....一看就是函数式数据结构。把点的权值推到节点下面的边上。离散化权值后,以权值建函数式线段树。用函数式线段树,树保存两个值,路径边上连接左右儿子的边为该权值的分别有几个。某条路径上的值就是两个节点对应函数式线段树的值相减。离散化时加入一个0,一个inf权值,防止-1,+1越界原创 2014-10-28 22:54:32 · 612 阅读 · 0 评论 -
poj3016 K-Monotonic,左偏树,dp
今天学习了一下左偏树(Leftist Tree)。左偏树是个二叉树,满足堆性质,它最神奇的地方就是右边比较短(嗯,然后他就可以往最右边递归合并,这样合并的复杂度也就是O(logn)级别插入就是将要插入节点作为一个树合并。弹出呢,只要把根节点的两个儿子合并一下就好了。 貌似这个东西应用不是很多啊。做了个poj3016练手。这个题问的是将一个数列变成k个严格单调串需要的总变原创 2014-08-12 11:39:40 · 689 阅读 · 0 评论 -
hdu 4729 An Easy Problem for Elfness,函数式线段树
hdu 4729 An Easy Problem for Elfness,函数式线段树13年成都网赛的题。主要是问一个树上的某两个点间的路径,你可以对某些边增加一些流量,最多这个路径上能流过多少流量。题目意思比较复杂(废话多),最大流量可以分成这几种情况:1、增加一条边,剩下的费用用来增加这条边的流量,加上本来两点间的流量。2、所有的费用用来建新边,加上本来的流量。3、原创 2014-10-07 16:39:02 · 699 阅读 · 0 评论 -
hdu4348 To the moon,函数式线段树
hdu4348 To the moon,函数式线段树修改某个区间,求某个区间的和,求某个区间过去某个时间的和,回到过去某个时间。这是函数式线段树的裸题了。修改区间可以将区间的变化量保存在对应区间的节点上,这样就不用lazy了。lazy还会导致更多的空间消耗。由于卡空间,我只好把线段树写成了不保存左右端点的形式(不符合我风格啊)。原创 2014-10-07 11:35:30 · 797 阅读 · 0 评论 -
poj1741 Tree,平衡树,启发式合并
poj 1741 Tree 平衡树,启发式合并。楼教主男人八题之一。点分治看腻了吧。来点新鲜的。关于启发式合并,我的上篇博客已经写了一些,请移步这里:http://blog.csdn.net/asdfgh0308/article/details/39790613这题和hdu4812一样,也是询问是否存在/存在多少个树某个路径满足条件。同样,每个叶节点建一个包含自原创 2014-10-07 03:19:56 · 2901 阅读 · 6 评论 -
hdu 4052 Adding New Machine,set
hdu4052 Adding New Machine,set比较老的题。给一个矩形和一些已经覆盖了的小矩形,问在剩余的空格上放一个长为m的条有多少种放法。可以用线段树化为矩形面积并搞。这里练习一下平衡树的做法,set也比较短。把矩形变为入和出两个事件,根据这些事件计算某行有多少空格,就能计算横着放有多少种放法。然后横竖各做一遍。这里利用set可以找到插入线段的两端第一个非空原创 2014-10-15 22:19:41 · 569 阅读 · 0 评论 -
hdu4819 Mosaic,二维线段树
hdu4819 Mosaic13年长春regional。二维线段树。需要变更某个点,询问某个矩形的最大最小值。在二维线段树里这只算个裸题。这里只说一点,为了保持O(nlogn)的复杂度查询在更新点的时候,需要将所有包含该点的区间的最大最小值都变更。假设n=3,当你修改点(2,3)你不仅要修改x=(2,2)的y轴线段树,也要修改x=(1,2)对应的y轴线段树。这里原创 2014-08-28 10:32:01 · 574 阅读 · 0 评论 -
poj3378 Crazy Thairs 高精度,树状数组
poj3378 Crazy Thairs 高精度,树状数组为了比赛,准备整理一套高精模板。虽然赵老师会Java,但是这玩意总是莫名不靠谱。本题,给一个有序集合,问原序满足从小到大而且值满足从小到大的五元组有多少个。按值建树状数组。每个点保存5个值,代表以当前节点为最后一个元素,长度为i(1然后按原数组序从左到右插入。每次查找比当前点值小的,长度为i-1的有集合总数,则当原创 2014-09-20 11:20:16 · 866 阅读 · 0 评论 -
hdu4973 A simple simulation problem. 线段树
hdu4973 A simple simulation problem.每种type的细胞为一个点建线段树,翻倍时找到相应区间翻倍即可。注意头尾特殊处理。真的是很simple的线段树题目。需要完成单点加,区间乘,询问区间最大值,询问区间和几个操作。就是这么简单的题目被我写了将近4小时。没什么好说的。代码中的node是没有必要的,记录一个最大值即可,因为不需要知道原创 2014-08-22 11:54:20 · 561 阅读 · 0 评论 -
poj3264,Balanced Lineup,线段树
简单的线段树#include#include#includeusing namespace std;#define N 50100#define ls (p<<1)#define rs (p<<1|1)#define mid(p) (t[p].l+t[p].r>>1)int v[N];struct segmentTree{ int l,r,mi,ma;}t[N*4]原创 2015-01-06 09:33:55 · 617 阅读 · 0 评论