线段树/树状数组
文章平均质量分 78
亚N程
这个作者很懒,什么都没留下…
展开
-
UVa:12299 RMQ with Shifts
线段树单点修改+区间最值。 其中shift的操作,只需要挨个改值就行了。 #include #include #include #include #include #include #include #include #include #include #define ll long long #define INF 2139062143 #define inf -213原创 2014-03-13 22:27:11 · 567 阅读 · 0 评论 -
POJ:2481 Cows
这题个人感觉不错,乍一看是个区间覆盖问题,其实是用树状数组求逆序数。 但是有些地方要注意。所谓stronger是指一个区间可以完全覆盖另一个区间,如果这俩区间完全相同是不算的。 按x左边升序排序,如果x相同y要降序排序。 在用树状数组的时候要注意了,假设区间为p[],我们这里是求p.y的逆序数,其实也要考虑p.x。 假设当前区间的下标为i(i从1开始),那么p[i]前一个元素的下标为i-1原创 2013-11-11 11:13:06 · 703 阅读 · 0 评论 -
HDU:1166 敌兵布阵
之前用树状数组过掉了,这次用线段树重写了一遍,和求区间最值的那代码基本一样。。 #include #include #include #include #include #include #include #include #include #include #define MAXN 200005 #define MOD 1000000007 #原创 2014-01-25 23:11:26 · 709 阅读 · 0 评论 -
UVa:11992 Fast Matrix Operations
以每行建立线段树处理即可。 注意两个地方。 1。同时有setv和addv标记的时候先处理setv,在处理setv标记的时候要清理子节点的addv。同样在结束的区间(即ql 而处理addv标记的时候不清理setv。 2。x,y分别对应行和列。不然会RE的很惨。。 做了这个题对懒惰标记的理解更深了一点。对于某个结点的setv和addv含义是要对该结点的子节点要做的操作,而不是当前的这个结点。原创 2014-03-21 11:59:23 · 574 阅读 · 0 评论 -
POJ:2528 Mayor's posters(未AC)
这是经典的线段树染色问题。用到了区间改值。 这个题的难点在于离散化。普通的离散化是不行的。因为在线段树和这个题中数字代表的是一段区间,这样4和5是相邻的。而且普通的离散化每个数都是相邻的。如果有两个区间 【1,6】,【10,20】,【1,20】。离散化以后就变成【1,2】【3,4】,【1,4】。很明显两个答案并不一样。这样,如果相邻两个点的差值大于1,则离散化的时候编号多加一。 POJ的di原创 2014-03-21 19:15:14 · 597 阅读 · 0 评论 -
UVa:1232 SKYLINE
线段树维护区间最值和区间替换。 1。设setv,maxv,minv分别表示区间替换值和区间最大值和最小值。在找到目标的区间后,如果setv大于当前区间最大值,说明该区间都可以,ans+=L-R+1,同时更新该区间,注意这里maxv和minv都要改成setv。如果setv小于当前区间最小值,那就没有必要更新了,就中断update。其他情况就继续下传。 2。结点信息下传的时候,minv要取该段区间原创 2014-03-20 18:49:00 · 834 阅读 · 0 评论 -
HDU:1754 I Hate It
开始刷线段树的题。上一道是单值加减,区间求和,我用树状数组过掉了。这道题是单值更新,区间求最值,只能用线段树了。 用了watashi翻译的那本书上的模版,把半闭半开的区间改成了全闭区间。另外数组开的大小问题还是不太懂。。 #include #include #include #include #include #include #include #includ原创 2014-01-25 22:39:31 · 793 阅读 · 0 评论 -
【完全版】线段树
FROM:http://www.notonlysuccess.com/index.php/segment-tree-complete/ 在代码前先介绍一些我的线段树风格: maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍 lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预转载 2013-08-19 17:37:32 · 642 阅读 · 0 评论 -
POJ:2886 Who Gets the Most Candies?
线段树模拟约瑟夫环+反素数。 #include #include #include #include #include #include #include #include #include #include #define ll long long #define INF 2139062143 #define inf -2139062144 #define MOD原创 2014-03-13 19:08:49 · 578 阅读 · 0 评论 -
HDU:2795 Billboard
再次领教了线段树的威力。维护一个最大值,优先选择左边的,更新操作写在了查询里面。 #include #include #include #include #include #include #define ll long long #define INF 2139062143 #define MAXN 105 using namespace std; con原创 2014-01-27 17:54:09 · 618 阅读 · 0 评论 -
HDU:1394 Minimum Inversion Number
用线段树求原始序列的逆序数,然后再递推求其它时候的逆序数,比较得最小值。 线段树求逆序数的原理跟树状数组一样,都是利用区间求和。我这里为了方便自己写的线段树,把下标调整成了从1开始到n 把当前第一个元素移动到末尾位置时,总逆序数的变化是:加上大于该数的个数,减去小于该数的个数。 #include #include #include #include #include原创 2014-01-26 23:50:22 · 547 阅读 · 0 评论 -
POJ:3321 Apple Tree
可以用树状数组实现,每次C就是改值,每次Q就是查询。但是由于题目是给的树结构,而树状数组求和是线性区间,所以需要将题目中的树节点编号,并对每个结点划分它的子树区间以便求和。 用dfs后序遍历整棵树标记序号,然后取子树中最小结点为左端点,自身编号是右端点。之后用树状数组就可以了。 用vector会超时,自己写了个数组的邻接表居然AC了。 #include #include #include原创 2014-03-14 23:13:10 · 559 阅读 · 0 评论 -
UVa:1428 Ping pong (树状数组)
如果之前做过树状数组求逆序数那再做这道题就很轻松了。 枚举以每个人为裁判,有两种情况,左边的人值比裁判小右边的人比裁判大,左边的人值比裁判大右边的人值比裁判大。左右两边相乘,两种情况相加就是答案。第一种情况需要统计位于裁判左边值比它小的个数和位于右边值比它大的个数,而第二种情况可以由第一种情况推出来。 所以重点就在统计位于裁判左边值比它小的个数和位于右边值比它大的个数。 这就需要用树状数组了原创 2013-11-07 19:41:50 · 726 阅读 · 0 评论 -
HDU:1698 Just a Hook
线段树区间更新,区间求和。模版题。 #include #include #include #include #include #include #include #include #include #include #define ll long long #define INF 2139062143 #define inf -2139062144 #define MOD原创 2014-03-15 21:33:17 · 594 阅读 · 0 评论 -
UVa:1513 Movie collection
树状数组。 开始按照n,n-1,n-2,,,3,2,1插入到树状数组并记录每个数字的位置,每次取出一个数,就输出该数位置到末尾的和,然后将该位置设为0,把该数字放到末尾并记录位置。注意数组要开100000*2。树状数组求和的时候上限是n+m。 #include #include #include #include #include #include #include #inclu原创 2014-03-14 19:47:40 · 533 阅读 · 0 评论 -
UVa:12086 Potentiometers
区间求和,单点改值。用线段树实现。封装成了一个类。 #include #include #include #include #include #include #include #include #include #include #define ll long long #define INF 2139062143 #define inf -2139062144 #def原创 2014-03-13 12:31:54 · 583 阅读 · 0 评论