
数据结构
Fenice
狂奔的蜗牛
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有原创 2012-10-05 22:48:26 · 748 阅读 · 0 评论 -
hdu1754线段树维护区间最大值
#include #include using namespace std;#define MAXN 200005int N,M;int grade[MAXN];struct node{ int left; int right; int max;}Tree[MAXN*20];int Build(int start,int end,int r原创 2013-08-04 12:20:42 · 2195 阅读 · 1 评论 -
hdu1166 敌兵布阵 线段树
TLE求错误啊啊啊啊啊啊啊#include #include #include #include #include using namespace std;#define MAXN 50010int ai[MAXN];int N;int T;struct node{ int left; int right; int sum;}Tree[M原创 2013-08-06 21:30:27 · 882 阅读 · 0 评论 -
树状数组
如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加 的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求数组中某段元素的和,就显得麻烦了。所以我们就要用到树状数组,他的时间复杂度为 O(lgn),相比之下就快得多。下面就讲一下什么是树状数组: 一般讲到树状数组都会少不了下面这个图:转载 2013-08-07 15:52:25 · 822 阅读 · 0 评论 -
hdu1166 树状数组
不知道为什么用C++输入输出死活不过,换成C的就过了。。。#include #include //==============================#define maxn 50020int c[maxn];int a[maxn];int n;int t;int lowbit(int x){ return x&(-x);}int Sum(int n原创 2013-08-07 16:37:38 · 1050 阅读 · 0 评论 -
poj 2352树状数组
#include #include #include using namespace std;#define MAXN 32001int sum[MAXN];int result[MAXN];int n;int lowbit(int k){ return k&(-k);}int GetSum(int n){ int s = 0; while(n原创 2013-08-07 19:55:21 · 921 阅读 · 0 评论 -
线段树模板(区间和最大值最下值)
//===========================================//segment tree//final version//by kevin_samuel(fenice)苏州大学孙俊彦#include #include #include using namespace std;#define MAXN 100#define INF 0x3ffff原创 2013-08-08 19:36:35 · 3904 阅读 · 0 评论 -
hdu1698线段树
//注意要成段更新,更新到段,不能到点//===========================================//segment tree//final version//by kevin_samuel(fenice)#include #include #include using namespace std;#define MAXN 100000#de原创 2013-08-09 23:32:34 · 1277 阅读 · 0 评论 -
hdu2795线段树
//===========================================//segment tree//final version//by kevin_samuel(fenice)//以h离散化构建线段树#include #include #include using namespace std;#define MAXN 201050#define原创 2013-08-09 21:53:19 · 955 阅读 · 0 评论 -
Trie树学习1
Trie树,也称为字典数,前缀树,每个单词的每个字母按照顺序对应一个节点。有重合的前缀就共享节点。理想情况下(满的情况),假若所有的单词都是N长,则树共有N层,每层都是26个子节点。在程序上,将根节点编号为0,根节点不代表任何字符。在程序的实现上,树可以用数组存储,也可以用指针实现,这里介绍简单的数组方法实现。用一个child[i][j]保存节点i的编号为j的子节点序号,j对应26个字母,原创 2014-06-24 01:53:21 · 1076 阅读 · 0 评论 -
Trie树学习2
数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie#include #include #include #include #include #include #include #include #include #include #include using namespace std;#define sigma_size 26#define原创 2014-06-26 01:56:55 · 1169 阅读 · 0 评论 -
hdu 1232 并查集
#include using namespace std;#define MAX 10001int N,M;int Father[MAX];int Rank[MAX];int sum;void Make_Set(int x){ Father[x] = x; Rank[x] = 1;}int Find(int x){ while(x != Father[x])原创 2013-04-12 22:21:09 · 711 阅读 · 0 评论 -
hdu 2066 Dijkstra 最短路应用
第三道最短路题目初始化的失误导致我WA 若干次,粗心啊,我的长处还是在管理啊,写程序和经管方面的能力比起来逊色不少#include #include using namespace std;const int maxn = 1002;#define inf 100000000int T,S,D;int a,b,c;int Dist[maxn];int原创 2013-01-02 01:40:04 · 647 阅读 · 0 评论 -
二叉查找树(自己写的版本)
#include #include #include #include typedef struct Tree{ int data; struct Tree *lchild; struct Tree *rchild; struct Tree *parent;}Bit_Search_Tree,*BST;//********原创 2012-02-09 16:32:22 · 671 阅读 · 0 评论 -
线性快速划分寻找第一个顺序统计量
#include #include int partition(int *R,int low,int high) //快速划分{ int key; key=R[low]; while(low<high) { while(lowkey) high--; if(low<high原创 2012-09-20 21:00:49 · 801 阅读 · 0 评论 -
堆排序__算法导论实现
这个排序是算法导论上堆排序的实现,#include#includeusing namespace std;void max_heap(int data[],int i,int len)//对于左右子树已是最大堆的树,将整个树生成最大堆{int left=2*i+1; int right=left+1;int large=i;if(left<=len&&data[i]<dat原创 2012-09-20 20:59:42 · 541 阅读 · 0 评论 -
并查集
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(翻译 2012-09-20 21:04:54 · 720 阅读 · 0 评论 -
图论基础-宽度优先遍历
基本思想:先访问顶点后访问与v0邻接的所有顶点v1,v2,v3……,再依次访问v1,v2,v3 的所有邻接的未访问的所有顶点,直到所有顶点被访问。借助队列来实现v0,bool visited[maxn];void BFS(int x){ int queue[maxn]; int iq=0; queue[iq++]=x; int i,k;原创 2012-09-22 03:12:55 · 653 阅读 · 0 评论 -
拓扑排序
基本算法:每一步 总输出当前无前驱(入度=0)的顶点.1.从有向图中选择一个没有前驱(入度=0,起始点)的顶点并输出2.从网中删除这个点,并删除从这个顶点出发的所有有向边.3.重复上述步骤,直到网中不再存在没有前驱的顶点int queue[maxn];int iq=0;for(i=0;i<=n;i++){ if(indegree[原创 2012-09-22 03:51:23 · 503 阅读 · 0 评论 -
图论基础-深度优先遍历DFS
基本思想:访问顶点v0,然后访问v0邻接的未访问过的顶点v1,再从v1出发递归的按照深度优先的方式遍历。当遇到一个所有邻接于它的顶点都被访问过的顶点u时,则回到顶点序列中最后一个拥有未被访问过的相邻节点的顶点W,从W继续出发。最终当任何已被访问过的节点都没有未被访问的节点时,遍历结束。bool visited[maxn]={0};void DFS(int x){ visited[原创 2012-09-22 03:11:37 · 982 阅读 · 0 评论 -
线段树
1、概述线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。2、线段树基本操作线段树的基本操作主要包括构造线段树,区间查询和区间修改。(1) 线段树构造首先介绍构造线段树的方法:让根节点表示区间[0,N-1],即所有N个数所组成的一个区间,然后,把区间分转载 2012-11-18 16:39:37 · 654 阅读 · 0 评论 -
hdu 1548
这题乍一看是个搜索,但是仔细一想用最短路来做更简单啊,图论就是有意思,把每层楼可能到每层楼的路径保存为一个图 1 2 3 4 51 M M M 1 M2 M M M M M 3 M 1 M 1 M 4 M 1 M M M 5 M原创 2013-01-03 00:56:17 · 689 阅读 · 0 评论 -
时间序列线段树
可以以O(log2(n))的时间复杂度处理任何日期序列的区间点修改和统计问题,例如维护区间和、区间内最大最小值平均数、区间内最大公因数、区间内的逆序数个数。以下为一个维护时间序列RMQ(区间最小值)的例子<?php/** * Description: 时间序列线段树 * */define("INFINITE", pow(2, 64));class TSSegTree {原创 2017-01-23 11:12:52 · 1230 阅读 · 0 评论