2011年10月20日
摘要: RMQ问题如果用线段树实现的话,可以实现O(nlogN)的预处理,O(logN)的查询,速度还可以。以求最大值为例,将key定义为区间的最大值。建立树时初始化为负无穷大把任意点a 看成区间[a,a],先把所有的点插入线段树。然后每次用线段树去查询代码如下:#include<iostream>#include<algorithm>using namespace std;const int MIN=-2000000000;//线段树的节点,包括基本域 :左右边界,左右孩子的指针 信息域:keystruct Node{ int ld,rd;//左右边界 Node *lc,*r 阅读全文
posted @ 2011-10-20 19:10 geeker 阅读(494) 评论(0) 推荐(0) 编辑
摘要: //线段树的节点//节点包括两部分信息,基本域,和信息域//基本域:左右边界ld,rd. 左右孩子:lc,rc//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值struct Node{ int ld,rd; Node *lc,*rc; int key;};//空树的建立,内含key值的初始化;//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树Node *buildtree(int a,int b){ Node * p=new Node;//给P申请一块内存 p->ld=a; p->rd=b; //{初始化 p->key 阅读全文
posted @ 2011-10-20 19:05 geeker 阅读(2198) 评论(0) 推荐(0) 编辑
摘要: 给定k个序列s1,s2,s3,...,sk,用二路合并方法将k个序列合并为一个。假设将任意两个长度分别为n和m的序列合并为一个需要的代价是m+n-1,设计一个算法来确定合并这些序列的合并为一个的最大代价和最小代价。#include<iostream>using namespace std;void swap(int &a ,int &b){ int temp=a; a=b; b=temp;}//返回数组arr[]的最大值void maxSink(int arr[],int n,int i){ int child; int j=i; while(j<=n/2){ 阅读全文
posted @ 2011-10-20 16:07 geeker 阅读(1399) 评论(1) 推荐(0) 编辑