
数据结构——树状数组、线段树
文章平均质量分 79
普通网友
这个作者很懒,什么都没留下…
展开
-
hdu1394 Minimum Inversion Number 单点更新
本题虽归于线段树,但实际上只是求逆序数时使用线段树,后面求最小逆序数时并不需要线段树。首先题目有两个要点:1.求出原序列的逆序数2.求出n次移动第一个位置数到最后的逆序数。对于第一个要点,实际上用暴力也可以解决,当然最好转到线段树的概念上来。以下我就引用一下别人的话好了。/ *先以区间[0,9]为根节点建立val都为0的线段树, 再看看怎样求下面序列的逆序原创 2013-10-27 15:41:47 · 514 阅读 · 0 评论 -
poj 2255 The order of a Tree | 二叉树
Q - The order of a Tree本题算是二叉树与搜索的结合体。题意就是:根据所给的两串序列,分别是前序和中序,求出二叉树的后序。思想:首先是从先序,在中序中找到根节点,插入到二叉树当中,标记这个字符已经被插入。然后根据刚才所插入的根节点,在中序中查询该节点两旁是否有还没插入的点(标记的用处),以确定是否需要建立左子树和右子树。如果要建立的话,继续从先序中,找到下一个节原创 2013-11-01 19:02:21 · 580 阅读 · 0 评论 -
hdu 5324 Boring Class cdq分治+树状数组+离散化
题意:给你两个序列,两个序列都有n个数。然后让你找到一个位置序列,对应到两个序列上,使得新的L序列非递增,R序列非递减。问你最长的长度是多少,并输出字典序最小的方案。思路:人生的第一道cdq分治,一直觉得这些类型学会了放在比赛也做不出来就没去学了。。。但看到辣么多人会做。。。赶紧搞起。思路、代码盗自别人blog:http://blog.youkuaiyun.com/u0130079原创 2015-08-01 15:09:47 · 446 阅读 · 0 评论 -
Codeforces 558E A Simple Task 线段树(区间更新)
题意:给你n个区间操作,把每个区间内的小写英文字母以非递增或非递减的方式进行排序,最后输出结果。思路:参考自:http://www.cnblogs.com/crazyacking/p/4649878.html因为只有26个字母,所以建立26颗线段树,来保存每个字母在所有区间的位置情况。线段树的作用:快速查询区间某个字符的个数,快速更新区间字符的个数。具体看代码内注释。原创 2015-07-20 11:19:15 · 422 阅读 · 0 评论 -
Codeforces 527C Glass Carving (set+multiset)
题意:对于一个矩形,宽为w,高为h。现在对其进行一系列的切割。让你求出每次切割后的最大面积的矩形(最大的矩形包含了前面所切割出来的矩形,我就因为这个弄错题意= =)。思路:set:内部已经有序,记录已经切割了的位置。multiset:内部已经有序,记录切割出来的长度。lower_bound(val):返回第一个>=val的数的位置。(二分)每次切割的时候,在set里面寻找最原创 2015-03-19 14:39:56 · 801 阅读 · 0 评论 -
Codeforces 540E Infinite Inversions 离散化+树状数组
题意:有一个无限长序列。进行n次操作,每次把下标为i, j的两个值交换。最后问你整个序列的逆序数的个数。思路:求逆序数分为两部分。一部分是交换过位置的,另一部分是没有交换过的。第一部分:用map处理n次操作后的情况。离散化后,利用树状数组求出交换过的位置的逆序数的个数。第二部分:看一个样例:21 69 5得到的序列为6 2 3 4原创 2015-05-03 21:29:26 · 879 阅读 · 0 评论 -
Codeforces 538F A Heap of Heaps 离线+树状数组+离散化
题意:给你n个数,这n个数构成1,2……,n-1叉树。问你构成1~n-1叉树,儿子比父亲大(即不符合最小堆的情况)的个数分别是多少。思路:首先把每个询问区间都求出来(每个询问区间分为两个区间,询问[l,r],则分为[1,l-1]和[1,r])两个for循环,遇到不存在的区间直接break。复杂度不会超,证明不会证= =||然后根据右端点从小到大排序(左端点都是1,因此结构体中不原创 2015-05-03 22:50:56 · 751 阅读 · 0 评论 -
upc 2224 Boring Counting (线段树+离线or主席树)+离散化
题意:1~n个数,询问l~r区间,值范围在A~B的个数。思路:线段树+离线(肉鸽跟我说的思路,以前真没碰到,线段树的花样太多了),用树状数组替代线段树也可以。首先先全部接收全部的询问, 然后再把每个询问区间,分为两个区间。例如2-8 -> 1-1和1-8。然后根据区间右端点从小到大排序,然后边更新线段树边查询,把查询的结果保存起来即可。code(线段树):原创 2015-04-09 12:25:16 · 413 阅读 · 0 评论 -
codeforces 515e Drazil and Park 线段树、区间最大子段和
题意:在一个公园里,有n棵树围成一个圈。每棵树的高度h以及相邻两棵树的距离d已给出。现在要选择两棵不同的树,使得2*(h1+h2)+dis(d1,d2)的值最大。每次询问都给出一个区间,所给的区间有小孩子在玩耍,因此不能进入。1.l 2.l > r, 则[1,r]和[l,n]不能进入;数据保证剩余的至少有两棵树是可以被选择的。思路:区间最大子段和,线原创 2015-03-12 16:43:47 · 834 阅读 · 0 评论 -
Codeforces 527D Clique Problem (dp+树状数组+离散化)
题意:在x坐标轴上有n个不同的点,每个点位置为xi,点权为wi。若|xi - xj| ≥ wi + wj.该式子,则i和j点可以连一条边。现在让你找出一个最大的点集,使得集合内任意两点有一条边连着。输出最大点集内点的数量。思路:感谢杰哥提供的思路。dp:现有3个点,x1 若x1和x2有边相连,x2和x3有边相连。即d1 >= w1+w2;d2原创 2015-03-20 12:55:33 · 604 阅读 · 0 评论 -
hdu 4585 Shaolin 线段树
题意:进入少林寺,在闯关成功后需要找一个已经原创 2014-11-02 13:34:21 · 492 阅读 · 0 评论 -
codeforces 483d Interesting Array 线段树
题意:给你区间n,m次询问原创 2014-10-27 19:45:15 · 605 阅读 · 0 评论 -
hdu 2492 Ping pong 树状数组
题意:AC代码:原创 2014-10-08 18:37:52 · 469 阅读 · 0 评论 -
hdu 4777 Rabbit Kingdom 离线+树状数组
题意:给你n个数,然后询问m次,让你原创 2014-10-25 14:15:33 · 462 阅读 · 0 评论 -
hdu 1166_线段树&树状数组
这题之前用线段树做过,不过这周开始树状数组的学习,就用树状数组重新写了一遍。与线段树相比,树状数组在单个点更新和区间求和方面更有优势。另外代码也很简洁。线段树AC代码:#include #include #include #include #include #define lson k<<1,l,m#define rson k<<1|1,m+1,rusing name原创 2013-11-27 14:43:51 · 487 阅读 · 0 评论 -
codeforces 488D Strip 线段树+dp+二分
题意:给你n个数,把这n个数分了几块(piece),问你最后分得的最少块数。要求:1.每块长度>=L 2.每块的最大最小值的差值不得大于s思路:很容易想到了用dp,但O(n^2)明显会超时。查询区间最大最小值,自然想到线段树。因此。可以这样来实现:定义dp[i]:前i个数,分割的最小块数。转移:dp[i] = min(dp[j]+1);(i-j>=l)建两颗线段原创 2014-12-12 16:25:30 · 735 阅读 · 0 评论