线段树
Speedcell
这个作者很懒,什么都没留下…
展开
-
HDU 1698 Just a Hook
需求:区间替换,区间求和。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ原创 2012-09-26 11:24:21 · 269 阅读 · 0 评论 -
HDU 4446 IT Companies
去年金华的题,现场看了一下就直接放下了。这题是直接构造答案就好了:c[i]来自两部分,[-i+1,-1]和[i+1,n]。如果当前c[i]==0,且i最小,则说明这两段都没有比i公司要大的了,并且如果在[1,i-1]这段区间如果有比i还要大的话,那么这个i肯定不是让c[i]等于0的最小的i。所以如果当前有最小的i使c[i]==0,那么i为当前最大。如果没有的话,取最小的c[i],这些比他大的公原创 2013-10-22 16:05:41 · 471 阅读 · 0 评论 -
线段树-树状数组专辑[建设中]
前略线段树这种高端大气上档次的东西,用法和树状数组一样非常灵活,一个简单比较如下: 线段树树状数组操作符要求满足交换律,不要求支持区间减法满足交换律,区间减法原创 2013-09-15 02:19:13 · 610 阅读 · 0 评论 -
POJ 3225 Help with Intervals
终于A了这题了,槽点略多:开闭区间使用奇偶数来区分开,这点非常巧妙,自己在写的时候没有这样想过。以前一直认为有多个lazy要维护的时候,在每次操作前就down掉就能避免掉矛盾操作的情况。这题发现是不行的,因为如果两次对同样的区间进行不同的操作,那子区间还是得到了两个操作的lazy,所以只能仔细分析每个操作的优先顺序。比如这题set操作明显是盖过xor的,如果要set了,那么下面的xor原创 2013-09-16 00:47:23 · 703 阅读 · 0 评论 -
HDU 4737 A Bit Fun
开始写的时候是用的O(n*(logn)^2)的复杂度,固定起点二分最远能到多远然后累加,但是这样TLE了,然后直接在树上二分完事。这里顺序是倒着来的,因为这个写法是查最右点,是为了修正不能区间修改而固定最左点的做法,所以去右子树的话一定要带上左子树的状态去。这题交G++跑1000MS+,但据说数据乱搞直接平方级暴力可以100MS+……/* Author : Speedcell原创 2013-09-15 11:30:16 · 1337 阅读 · 0 评论 -
Codeforces 52C Circular RMQ
不想说什么了,这两天脑袋被门夹了……#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2013-03-06 00:20:56 · 649 阅读 · 0 评论 -
POJ 2352 Stars
需求:单点更新,区间查询。用命名空间写东西还是有小清新的感觉的。边插入边查询就好了,因为输入以及保证有序,所以直接搞就好了。#include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2012-11-05 14:08:42 · 301 阅读 · 0 评论 -
POJ 3264 Balanced Lineup
需求:单点更新,区间最值。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2012-11-05 14:30:33 · 304 阅读 · 0 评论 -
HDU 1166 敌兵布阵
复习线段树,把NotOnlySuccess上面的推荐题目都刷一遍。需求:单点更新,区间求和。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2012-09-25 20:15:29 · 307 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers
需求:区间更新,区间求和。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ原创 2012-09-26 11:32:46 · 300 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number
需求:单点更新,区间求和。先一遍找出各点左边有多少个比自身大的数,即逆序对,然后把队首元素移动到队尾,刚好原来呈现逆序的消失,不呈现逆序的出现。#include #include #include #include #include #include #include #include #include #include #include #include #in原创 2012-09-25 20:20:20 · 263 阅读 · 0 评论 -
HDU 1754 I Hate It
需求:单点更新,区间最值。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2012-09-25 20:17:21 · 254 阅读 · 0 评论 -
POJ 2528 Mayor's posters
需求:区间替换,单点查询。这题按NotOnlySuccess的做法是离散化线段,这样会造成他博客上说得问题,他的解决方案是加上微小的偏移量。我这里提出一个自认为更好的做法:不要离散化线段,而是离散化坐标点,因为线段树其实是点段数,不管什么操作其实都是最一个区间上的点集的得操作,而不是区间本身,解法如下:离散化坐标点,区间替换成当前海报的标号,然后线扫坐标点,hash海报标号统计不同个数原创 2012-09-26 11:53:50 · 746 阅读 · 0 评论 -
POJ 1151 Atlantis
需求:区间更新(覆盖次数,总长度),整体查询(总长度)。因为是总体查询,只需要看len[1]即可,而且正因为如此不需要精细到每个叶子节点的len,只要更新到当前需要的区间,回溯到根即可。若是下一次有更底层的更新在这层可以滤过,不需要更新到底所以从整体上省去了lazy操作。解法:离散化之后查询每次更新前整体总长度与上一次的纵坐标差相乘,累加即可。G++交的话有小trick,printf(原创 2012-09-27 11:17:28 · 342 阅读 · 0 评论 -
Codeforces 558E - A Simple Task
算法总在某个范围不大的维度上直接暴力。这次的维度是字符集的大小,总共只有26个字符,所以直接用counting sort,其实这货也算是桶排吧,但是要能用这样的排序还有一个条件是不区分原子吧。 每次操作在制定的区间上,先查询出每个字符分别有多少个,然后按大小排列好。查询和排列用线段树维护,所以每次操作都是O(logn)O(logn)的复杂度。最后从头到尾查一次就好了。 之前用Python写了这原创 2015-07-16 00:58:45 · 594 阅读 · 0 评论