随笔分类 -  线段树和树状数组

摘要:POJ 2528 求没有被完全覆盖的海报(不知道是不是这个意思)有多少张。注意题目一开始给的数字不是线段的端点而是线段。所以离散化的时候需要先处理,也就是把右端点+1.然后离散化,插入的时候应该插入线段,所以应该插入(left, right-1)。然后查询只需查询一次,标记即可。 ZOJ 2301, HDU 1199 做法是一样的,都是一维线段树,比较好处理。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <cmath> 阅读全文
posted @ 2011-11-13 16:41 like@neu 阅读(419) 评论(0) 推荐(0)
摘要:题意:每次交换数组相邻的两个位置的值,耗费是两个值的和。求使数组排序的最小花费; 解法:树状数组; 我的做法是从后往前遍历数组,对a[i],求出比a[i]小下标却比i大的元素个数x,然后求出这x个值的和temp,sum(a[i]*x+temp)(1<=i<=n)即为所求。至于为什么要这样做,原因很简单,大家都知道最少的交换次数是求逆序数。但是总花费最小是不是也是这样求?答案是:是。 这是可以证明的,因为每次只能交换相邻的两个数,所以只要存在a[i]>a[j](i<j)则a[i],a[j]则至少会交换一次。所以当他们只交换一次的时候总花费是最小的。 还有一个需要注意的地方 阅读全文
posted @ 2011-09-25 10:34 like@neu 阅读(245) 评论(0) 推荐(0)
摘要:题目传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 题目意思是区间涂色,求最后能看到的颜色的段数。解法是线段树。 建立一棵线段树,对每一条线段用点表示,比如0-4,就表示成1 2 3 4四个点。其实不这样也行。只是这样表示更直观了。每次插入一个区间和这个区间涂的颜色。如果这个区间正好是一棵树的左右边界,就直接更新这棵树的颜色,不再往下传递。不然的话,就要往下修改,而且这棵树的颜色也要传给它的子树。比如更新区间1 2,当前这棵树的左右边界分别是1 4,而且颜色和更新的颜色不同,那就应该把他的子树全部变.. 阅读全文
posted @ 2011-09-02 12:04 like@neu 阅读(226) 评论(0) 推荐(0)
摘要:线段树水题- -囧。。每天做水题。 看了discuss里面有人用树状数组过了这个题,我也试了一下,简单的树状数组tle了,bit的扩展也实在不会,太菜b了--,最后还是放弃了。线段树实现也不是很复杂,无非是一些细节的地方吧。正式比赛绝对碰不上这个层次的水题了吧。话说比赛遇到的线段树都是……哎,泪狂奔啊= =! 虽然贴代码是一个非常掉rp而且招人bs的习惯,我还是把代码贴一下吧>_<#include <iostream>#include <string.h>#include <algorithm>#include <fstream>#i 阅读全文
posted @ 2011-09-01 09:48 like@neu 阅读(271) 评论(1) 推荐(0)