
数据结构
文章平均质量分 70
Think_Idea
水滴石穿
展开
-
RMQ问题的4解决方案
问题描述:RMQ(Range Minimum/Maximum Query),顾名思义就是区间最大最小值查询:给定一个数列,求给定区间[a,b]上的最大值或最小值解决方案:1、枚举,遍历数列[a,b]找出最大最小值即可。单次查询时间复杂度o(n)2、线段树,分治思想,单次查询时间复杂度o(logn)const int inf = 0x7fffffff;struct n原创 2016-02-21 18:08:21 · 457 阅读 · 0 评论 -
用二叉堆实现优先队列
#include #include #define MAXN 100010using namespace std;class priority_queue{ int sizet,heap[MAXN];public: void clear(){ sizet=0; } void push(int x){ int i=sizet+原创 2015-09-15 13:28:27 · 596 阅读 · 0 评论 -
hdu 2227Find the nondecreasing subsequences(树状数组+dp+离散化)
题目链接:点击打开链接题意描述:给定一个序列,找出其中递增子序列的数量?解题思路:1、dp[i]:表示以元素i结尾的子序列的数量,则d[j]=sum(d[i])+1;其中(j>=i且j的下标大于i)2、此刻我们可以联想到树状数组,按数组下标从小到大的顺序插入元素,那么d[j]就等于sum(j)+1;3、由于数据范围比较大,我们采用离散化处理即可代码:#i原创 2015-08-28 15:03:00 · 584 阅读 · 0 评论 -
hdu4267 A Simple Problem with Integers(树状数组区间更新点查询)
题目链接:点击打开链接题意描述:给定一个数组,有两种操作:操作一:a b k c 对于区间a~b之间的元素如果下标满足(i-a)%k=0则给元素i加上c操作二:a 查询下标为a的元素当前值解题思路:1、首先这个涉及到区间修改点查询,所以应该想到使用树状数组或线段树2、修改的区间是不连续的,为了使不连续可以转换为连续的,我们对每种情况进行枚举,有55种情原创 2015-08-28 13:01:19 · 665 阅读 · 0 评论 -
hdu3887 Counting Offspring(dfs序+树状数组)
题目链接:点击打开链接题目描述:给定一棵树,统计一棵子树中节点编号小于子树根节点的数量?解题思路:先dfs预处理,对于每个子树可以得到一段连续的序列使用树状数组求连续区间的和注意:1、树是无向图,建树时注意建两条边,由于测试案例比较坑,我以为左边为右边的父节点,所以建图时只见了一条边,导致一直tle2、dfs容易栈溢出,记得使用stack模拟递归(sta原创 2015-08-25 16:39:32 · 875 阅读 · 0 评论 -
树状数组区间求和三种模型
树状数组在区间求和问题上有大用,其三种复杂度都比线段树要低很多……有关区间求和的问题主要有以下三个模型(以下设A[1..N]为一个长为N的序列,初始值为全0):(1)“改点求段”型,即对于序列A有以下操作:【1】修改操作:将A[x]的值加上c;【2】求和操作:求此时A[l..r]的和。这是最容易的模型,不需要任何辅助数组。树状数组中从x开始不断减lowbit(x转载 2015-08-25 10:11:39 · 464 阅读 · 0 评论 -
hdu3015 Disharmony Trees(树状数组+排序)
题目链接:点击打开链接解题思路:1、首先对x和高度h分别从小到大排序记录排名2、然后对高度h按从大到小排序(保证当前要计算的树的高度是所有已经遍历的树中最小高度,便于计算S=min(h1,h2))3、循环遍历数组,每次遍历向树状数组C中t[i].rx位置增加t[i].rx,向树状数组C1中t[i].rx位置增加1解析:C记录排名和,C1记录个数所以以t[i].rh为原创 2015-08-21 10:31:55 · 870 阅读 · 0 评论 -
hdu2838Cow Sorting(树状数组+逆序数)
题目链接:点击打开链接题意描述:给定一个长度为100000的数组,每个元素范围在1~100000,且互不相同,交换其中的任意两个数需要花费的代价为两个数之和。问如何交换使数组有序,花费的代价最小?解题思路:1、显然我们知道,要使一个数组有序至少交换的次数(即必须要交换的次数)为数组中的逆序数2、由于数组的长度比较大所以我们可以通过树状数组来统计结果此处需要两个树状数组第一个原创 2015-08-20 21:55:26 · 682 阅读 · 0 评论 -
hdu2688 Rotate(树状数组)
题目链接:点击打开链接题意描述:对一个长度为2中数组元素F[i]范围(0操作一:R x y(其中y-x操作二:Q查询当前数组中含有的有序对的数量解题思路:1、先求的原始数组中有序对的总数量(如果直接求,则时间复杂度为O(n*10000);如果使用树状数组时间复杂度为O(nlgn))即O(n*14)2、对于每次操作一,循环遍历F[x+1]~F[y]中元素与F[x]的关原创 2015-08-20 19:56:44 · 749 阅读 · 0 评论 -
RMQ(st在线算法模板)
#include#include#includeusing namespace std;#define M 100010#define MAXN 500#define MAXM 500int dp[M][18];/**一维RMQ ST算法*构造RMQ数组 makermq(int n,int b[]) O(nlog(n))的算法复杂度*dp[i][j] 表示从i到i+2^j原创 2015-08-18 21:13:52 · 1138 阅读 · 1 评论 -
树状数组模板
1.下标从1开始2.相对于线段树,节约内存空间,效率高3.求解x1-x2区间的内容时:sum(x2)-sum(x1-1)一维:int lowbit(int x){ return x&(-x);}int sum(int pos){ int res=0; while(x>0){ res+=C[x]; pos-=lowbit(po原创 2015-08-18 20:47:30 · 347 阅读 · 0 评论 -
hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接题目描述:给定一些矩形,求这些矩形的总面积,如果有重叠,只算一次解题思路:扫描线+线段树+离散(代码从上往下扫描)代码:#include#include #define MAXN 110#define LL ((rt<<1)+1)#define RR ((rt<<1)+2)using namespace std;int n;struct原创 2015-08-17 17:49:20 · 780 阅读 · 0 评论 -
ACM常用数据结构
基本结构高级结构题单集合结构 幷查集POJ 1182POJ 1308POJ 1611POJ 1986POJ 1988线性结构数组栈队列双端队列POJPOJPOJPOJPOJ树状结构二叉树BST转载 2015-06-09 21:14:13 · 724 阅读 · 1 评论 -
ACM常用数据结构小结与实现
应当说这段时间学习了很多的数据结构,也到了一个总结的时候。fotile96的这篇Blog非常值得推荐,我达不到这个高度,只能给自己和队友做些简单的归纳。 树状数组 非常简单的数据结构,只需要一个数组,一切操作基于如下的函数。需要注意的是,树状数组的下标必须从1开始(从0开始会死循环)。它可以做到在O(logn)时间内完成下述的操作。[cpp] view plai转载 2015-06-09 21:02:22 · 5302 阅读 · 3 评论 -
poj1182食物链(带权并查集)
///基本思路:带权并查集(简单的理解就是将有关系的点合并到一个集合,记录每个点到集合根节点的权重)#include #include #include #define MAX 50010using namespace std;int par[MAX];///记录集合根节点int offset[MAX];///记录每个节点到根节点的偏移量int n,m;void make_se原创 2015-05-10 11:38:07 · 492 阅读 · 0 评论 -
带全并查集(并查集拓展应用)
并查集是一种优秀的数据结构,能够支持快速的查找某元素所在的集合以及合并操作。最常见的并查集的实现方式是森林,通过记录所有结点或者部分结点(下面会看到)的父节点来记录森林。并查集的详细实现方式可以参考CLRS第二十一章。 信息学竞赛中基本的并查集题目比较少,大多要对并查集进行一些拓展,多记录一些信息以完成计算。竞赛的题目有很大一部分是询问两个结点的相对信息,结点a相对结点b的信息用f(转载 2015-05-10 09:43:57 · 639 阅读 · 0 评论 -
poj1861Network(最小生成树-克鲁斯卡尔算法)
///基本思路:最小生成树克鲁斯卡尔算法(排序+并查集)http://poj.org/problem?id=1861#include #include #include using namespace std;struct node{ int x; int y; int v; int pos;///记录读入时的位置原创 2015-05-09 23:12:47 · 479 阅读 · 0 评论 -
树状数组模板
#include #include #define MAX 1010int d[MAX];///保存原始数组数据int c[MAX];///保存树状数组int s[MAX];///原始数据前i项和,用于初始化c[]数组时使用int n;///数组长度int lowbit(int k){ return k&(k^(k-1));}void ma原创 2015-05-04 22:37:29 · 470 阅读 · 0 评论 -
hdu1213+并查集模板(优化)
#include #include #include using namespace std;const int MAX=1010;bool flag[MAX];int n,m;int par[MAX];int ranks[MAX];void make_set(){ for(int i=1; i { par[原创 2015-05-03 23:17:27 · 491 阅读 · 0 评论 -
并查集
并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。使用并查集时,首先会存在一组不相交的动态集合 S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。每个集合可能转载 2014-12-01 16:44:05 · 445 阅读 · 0 评论