hihocoder上的这一篇文章写得特别赞!很好理解。
“在我介绍别的算法之前,你先来讲一讲你是准备如何使用线段树来解决这个问题的吧?”小Hi虽然做好了讲解的准备,但是还是希望能够一步步引导小Ho进行思考,于是这般说道。
“唔……那我先从线段树的定义说起吧:线段树其实本质就是用一棵树来维护一段区间上和某个子区间相关的值——例如区间和、区间最大最小值一类的。”小Ho说道:“它的具体做...
分类:
其他好文 时间:
2014-11-19 01:29:43
阅读次数:
259
题目大意:求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数题解:观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1。。即问题转化为求区间 [1,b/k]和 [1,d/k]的互质数对个数由于题目规定 (x,y)和(y,x)是同一种,所以我...
分类:
其他好文 时间:
2014-11-13 23:45:17
阅读次数:
329
题目:给定一个目标区间[x,y]和N个无序的源区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。思路:把源区间按x从小到大排序,再把区间依次合并,每完整得到一个合并区间后,判断[x,y]是否在合并区间内。#include #include typed...
分类:
其他好文 时间:
2014-11-13 20:26:56
阅读次数:
288
poj 2528 Mayor's posters(动态线段树)
题目大意:
给定一个 1 ~ 10000000 的区间,然后有N次操作(N <= 10000),第i次操作是将 l~r 区间覆盖为i。问最后一共有多少种有颜色。
解题思路:
一开始想到了离散化,但是想了一想感觉有点麻烦 然后就问专职搞数据结构的队友。然后他说了 动态线段树。思路如下:
定义一个ID。然后 根节点1表示掌管1-MAXN颜色的区间。然后每次都是动态的建树。当一个区间的左子区间还不存在时。建立它,并且记录下每个区间的左子区间和右子区间...
分类:
其他好文 时间:
2014-11-09 18:11:55
阅读次数:
200
/*
题意:给你二个区间[a,b]和[c,d]
分别从中选一个数x和y使的(x+y)%p=m;
可以这样来求,先求出(0->b和0->d区间段的值)-(区间0->a-1和0->d的值)-(区间0->b和0->c-1的值)+(0->a-1和0->c-1)的值
而且发现有这样的规律对于连个区间的末端值a和b来说
当在0->a这个区间内有一个单调性,a->b-1这个区间内有单调性,b-(a+b-m)/p...
分类:
其他好文 时间:
2014-11-07 20:58:34
阅读次数:
305
今天第一次接触可持久化数据结构,还是有必要总结一下的。首先对于查找第k大的问题,先搞清楚怎么样通过利用N颗线段树来求解。如果是求全局第K大,那么可以把数字的值作为位置插入线段树,然后通过区间和+二分来找到第k个位置。因为是通过区间和来找第k大的,显然是满足前缀和性质的,所以查询l,r区间的第k打,就...
分类:
其他好文 时间:
2014-11-07 20:46:35
阅读次数:
216
各种操作,区间更新,求最值、翻转、插入、删除、当然是Splay这种神器了。主要是 revolve这个操作,其实也就是3个区间翻转放到一块,比如REVOLVE x y T,T %= (y-x+1); 其实就是 先把 x y区间翻转,然后把 x x + c - 1区间和 x+ c y区间分别翻转。代码:...
分类:
其他好文 时间:
2014-11-06 23:19:35
阅读次数:
344
区间选点+区间覆盖
区间选点问题(选择最少的点,使得每个区间都至少有k个点)
将这些区间[l,r]先按照r从小到大排序,再按照l从大到小排序。选点尽量选择靠近右边界的点。然后按照这个排序后的区间进行遍历,用一个变量来存放遍历过程中上个区间的右边界,然后碰到一个新的区间的时候需要分两种情况讨论:1、这个区间和上个区间有相交的部分,那么就需要判断一下上次选择的点有多少在这个区间内,这些...
分类:
其他好文 时间:
2014-10-31 06:27:33
阅读次数:
306
题目大意:给定长度为n的数组,求出最大的区间和,其中区间长度在[1,k]之间分析:学动态规划的时候我们会遇到一个经典问题最大子段和,这个题跟最大子段和很类似 不同的是区间的长度有限制,无法用原算法解决转换思路区间[i,j]的和就是ans=sum(j)-sum(i-1) ( j - i #includ...
分类:
其他好文 时间:
2014-10-24 20:28:07
阅读次数:
233
题目大意:有一颗长满苹果的苹果树,有两个操作。
1.询问以一个点为根的子树中有多少个苹果。
2.看看一个点有没有苹果,如果没有苹果,那么那里就马上长出一个苹果(= =!);否则就把那个苹果摘下来。
思路:进行一次深搜,将每个节点最开始出现的时间和最后出现的时间记在一个数组里,那么这两点之间的点就是它以及它的子树的二倍,然后就用树状数组来维护区间和就行了。
CODE:
...
分类:
移动开发 时间:
2014-10-16 12:08:52
阅读次数:
200