思路:全都已经介绍了。连步骤它都告诉你了。差的只是实现了。两种实现方法:(1)用链表做树(2)用顺序表做树。顺序表的速度更快,因为不用管链的问题。空间谁更省?树是接近平衡的,也就是叶子节点在最下两层,但是如果树深一点,用顺序表就会浪费很多空间,这底层可能比之前存的都要多,但是链表却每个点都要消耗。总...
分类:
其他好文 时间:
2015-05-15 21:21:40
阅读次数:
230
G++77ms0MB思路:这题用暴力是最快的,甚至比线段树还佳。 按全部都是查询的来算,是O(n*q)。 1 #include 2 using namespace std; 3 const int N=10010; 4 int w[N], n, q, L, R, tmp; 5 6 int mai.....
分类:
其他好文 时间:
2015-05-15 19:36:47
阅读次数:
144
问题描述 依然是RMQ问题。过程需要修改某些点的数据。 使用线段树解决。 单点修改的复杂度是O(logn),即树深,只需要修改这个点的祖先节点。 区间查询的复杂度也是O(logn),因为除了第一步可能一分为二外,其他查询若有分解则分解后必然有一个区间是不需要再分解的。#include #includ...
分类:
其他好文 时间:
2015-05-14 15:56:32
阅读次数:
96
问题描述 询问区间最小值,过程中会对某些位置的值进行修改。 这题数据量很小,使用O(NQ)的方法做。 后续会有其他高效的解法。#include int data[10005]; int main(){ int n, q; scanf("%d", &n); for (int i = 1; i <= n...
分类:
其他好文 时间:
2015-05-14 14:03:30
阅读次数:
183
#include
#include
#include
#include
#include
using namespace std;
#define maxn 1000000 + 10
#define Lson L, mid, root<<1
#define Rson mid+1, R, root<<1|1
#define INF 0x7ffffff
int Min[maxn<<2],...
分类:
其他好文 时间:
2015-05-02 20:47:23
阅读次数:
125
RMQ (Range Minimum/Maximum Query):对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
分类:
编程语言 时间:
2015-04-19 17:50:40
阅读次数:
181
转自:http://blog.csdn.net/lilongherolilong/article/details/6624390先挖好坑,明天该去郑轻找虐RMQ(Range Minimum/Maximum Query)问题是求区间最值问题。你当然可以写个O(n)的(怎么写都可以吧=_=),但是万一要...
分类:
编程语言 时间:
2015-04-18 21:45:17
阅读次数:
154
题意:给出非降序的n个数字的序列(有重复),然后给出i,j问[i,j]范围内出现最多次数的值的次数。
题解:经典的RMQ问题,按书上题解的思路,先把序列分段,即相同数字是一个段,用val[cnt]和count[cnt]表示第cnt段的值和出现次数,num[i],l[i],r[i]分别表示位置i所在段编号(cnt),左右端点位置,那么每次查询[i,j]时,就是要计算i到i左端点的元素个数,j到...
分类:
其他好文 时间:
2015-04-04 19:47:58
阅读次数:
131
1 #include 2 #include 3 #include 4 using namespace std; 5 const int N = 50010; 6 #define INF 0x3f3f3f3f 7 int maxn[N<<1][18] , minn[N<<1][18] , a[...
分类:
其他好文 时间:
2015-04-02 13:10:45
阅读次数:
165
原题地址终于做到线段树的题了,因为建树、更新、查询都是递归操作,所以其实挺好写的。用数组存的树,记得MAX_NODE开成两倍叶节点数大小,否则RE啊。。不要问我是怎么知道的。代码: 1 #include 2 #include 3 using namespace std; 4 5 #d...
分类:
其他好文 时间:
2015-04-01 21:40:48
阅读次数:
136