数据结构
文章平均质量分 53
刘荣浩
And your bird can sing.
展开
-
单向链表(还没有借鉴其他的实现方法)
链表的建立,输出,删除,在第i个点后加入新点,删除第i个点5个操作,编译环境是codeblocks#include <stdio.h>#include <stdlib.h>using namespace std;struct node{ int data; node *next;};node *creatList(int n){ int temp; node *原创 2016-05-25 13:49:03 · 308 阅读 · 0 评论 -
uvalive3027 Corporative Network
题目链接:https://vjudge.net/problem/UVALive-3027题意:有个两个操作,I操作把u的父节点更新为v,把距离更新为abs(u-v)%1000,保证在这之前,u没有父节点。E操作询问u到根的距离。思路:I操作保证了在这之前u没有父节点,那么可以直接pa[u]=v; d[u] = abs(u-v)%1000; E操作可能是访问I操作中u的儿子节点到父节点的距离或者是u原创 2017-08-04 09:55:37 · 194 阅读 · 0 评论 -
uva11235 frequent values(Sparse Table)
题目链接:https://vjudge.net/problem/UVA-11235题意:给一个非降序的整数数组a,求[i, j]中出现最多次数的数,出现了几次。思路:明显的是RMQ问题。白书上用的是Sparse Table,这个叫ST表就变成了表表….一开始思路就被定死,求出现最多的数出现的次数,感觉无从下手。看到刘汝佳的做法,还有这种操作….先进行游程编码,把相同的数压缩成一个点,对于所求的区间[原创 2017-08-06 19:45:15 · 293 阅读 · 0 评论 -
poj2352 && hdu1541 Stars(树状数组)
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)原创 2016-08-16 18:09:42 · 361 阅读 · 0 评论 -
hdu1754 I Hate It(线段树,单点更新,区间最值)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1754思路:线段树,实现单点更新,区间最值查询注意:注意字符的处理,要么用getchar()来处理,要么用字符数组来处理。代码:#include #include #include #include using namespace s原创 2016-08-19 19:58:21 · 268 阅读 · 0 评论 -
hdu1698 Just a Hook(线段树,区间更新)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1698题意:某个钩子由n个小钩子组成,有q个操作,将某个区间内的小钩子的材料改变,有金银铜三中材料,每种材料价钱不同。问最后这个钩子的价值思路:线段树,区间更新(不是相加更新),最后输出根节点的值即可。关键在于,如何理出用线段树来解决这一题,重点是理解更新。原创 2016-08-19 20:55:26 · 295 阅读 · 0 评论 -
uvalive 4329 Ping Pong(树状数组)
题目链接:https://vjudge.net/problem/UVALive-4329题意:一条直线上有n个乒乓选手,每个人有一个技能值ai,他们之间需要切磋,需要一个裁判,裁判的技能值要在两个人之间,问一共有多少个个方案。裁判不同或者选手不同都可以看做是不同的方案。思路:参照白书。考虑第i个人当裁判,设a[1]到a[i-1]有c[i]个比a[i]小,那么有(i-1)-c[i]个比a[i]大,a[原创 2017-08-04 16:05:37 · 330 阅读 · 0 评论 -
poj3468 A Simple Problem with Integers(线段树,区间更新,区间和查询)
题目链接:http://poj.org/problem?id=3468题意:给出n个数,有q个操作,其中一种操作是将某个区间都加上某一个整数,另一个操作是询问某个区间的和。思路:线段树,区间更新,区间和查询。区间更新自然用到lazy-tag。模板题,关键还是理解模板。注意数据范围代码:#include #include #includ原创 2016-08-19 20:46:05 · 349 阅读 · 0 评论 -
poj3264 Balanced Lineup(ST表)
链接:http://poj.org/problem?id=3264题意:n头牛排成一行,问a到b这个区间内最高的牛和最矮的牛的身高差。思路:这题用的是ST表,初学ST。这题算模板题了,关键还是要理解。。另外,某位巨巨说用代码中的方法求k值可能会被卡。代码:#include #include #include #include #i原创 2016-08-19 20:34:49 · 290 阅读 · 0 评论 -
hdu2795 Billboard (线段树,单点更新)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2795题意:有一个高为h,宽为w的billboard,有n个广告,每个广告高1,宽为wi,将n个广告从上往下放,并且尽可能放满一行,问n个广告分别放在哪一行。思路:线段树,这里可以一边查询一边更新,每个树节点存对应区间中所能放的广告长度的最值,初始化为w,那么原创 2016-08-19 20:12:34 · 277 阅读 · 0 评论 -
ZOJ 1610 Count the Colors (线段树)
题目链接:点击链接题意:在x坐标轴上画线,每条线给出起点,终点,颜色编号,要求输出画了n条线后,每种颜色的线段有多少条思路:注意这里是[start, end]区间内为一种颜色,可以认为不包含起点终点,和以往那些包含起点终点的题目还是有区别的。处理的方法是起点加一。建树的时候,当颜色把当前区间完全覆盖时,我们就不往下打。查询的时候,先push down,如果当前区间在目标区间内时,遇到标记直接统计原创 2017-08-22 20:55:35 · 261 阅读 · 0 评论 -
hdu4027 Can you answer these queries?(线段树)
题目链接:点击链接题意:有n个数,现在有一种操作,将这n个数中的一个区间[x, y],每个数都开平方。询问区间的和。思路:建树的时候,当前节点保存了对应区间的和。更新的时候,若当前节点对应的区间为[l, r],如果区间和小于(r-l+1),不往下更新,反之往下更新。代码:#include <iostream>#include <cstring>#include <cstdio>#inclu原创 2017-08-23 13:52:05 · 220 阅读 · 0 评论 -
hdu1540 Tunnel Warfare(线段树)(好题)
题目链接:点击链接题意:有n个村庄,连成一条线,有三个操作。操作一,将指定的一个村庄摧毁;操作二,查询指定村庄所在的线段上有多少个没有被摧毁的村庄;操作三,将上次被摧毁的村庄重建。思路:操作一和操作三是基础的单点更新。操作二的查询,需要查询连续区间的长度,建树的时候要对每个节点对应的区间[l, r]记录从l开始向右的最大长度prefix,从r开始向左的最大长度suffix,记录中间的最大连续原创 2017-08-23 14:46:02 · 476 阅读 · 0 评论 -
hdu3974 Assign the task(线段树/dfs)(好题)
题目链接:点击链接题意:给一棵n个点的树,点标号从1到n。有两种操作,操作1,将树上的某个点以及它的子孙都赋值为某个数;操作2,查询某个点的值。思路:做法一:dfs。更新时,将目标节点更新就行,给节点记录一个时间戳。查询时,向上访问父亲节点,对比儿子节点和父亲节点的时间戳,如果父亲节点的时间戳晚于儿子节点,儿子的值等于父亲的值,反之亦然。代码:#include <iostream>#include原创 2017-08-23 15:29:41 · 481 阅读 · 1 评论 -
UVA11992 Fast Matrix Operations(线段树)
题目链接:点击链接题意:给一个矩阵,有三个操作。操作1,将这个矩阵的一个子矩阵的值全加上v。操作2,将这个矩阵的一个子矩阵的值全置为v。操作3,求这个矩阵的一个子矩阵的最大值,最小值,和。思路:看似很简单的set和add操作,我这个线段树菜鸡,卡了很久。前几天写另一道线段树时,突然明白set操作和add操作先后顺序对答案的影响。都明白先add后set,前面的add会被置0,执行Set操作的时候,懒标原创 2017-08-23 16:03:03 · 347 阅读 · 0 评论 -
uva11997 K Smallest Sums(优先队列)
题目链接:https://vjudge.net/problem/UVA-11997题意:有k个长度为k的数组,从每个数组中取一个数加在一起得到一个新的数,按照这样操作,问得到的前k个最小的数是什么。思路:一共有k^k次方个数,k<=750,直接构造出来不可行。当只存在两个这样的数组的时候,设分别为数组a, b。分别将a,b数组从小到大排序。 可以构造如下: a1+b1 <= a1+b2 <= a原创 2017-08-02 19:18:17 · 309 阅读 · 0 评论 -
POJ2528 Mayor's posters(线段树)
题目链接:poj2528题意:n张等高的海报,贴在一堵无限长度的墙上,给出海报的起始坐标,海报张贴的顺序,海报会被覆盖,问最后能看见多少不同的海报。思路:海报的下标最大为1000W,线段树是存不下的,但是海报的数量只有10000,可以利用离散化技巧,把这10000个海报的起始下标重新分配序号,再用线段树维护。 这里是区间更新,整个区间置为一个值(其实只需要维护一个懒标记就可以了)。查询的时候,要跑原创 2017-08-16 16:02:36 · 297 阅读 · 0 评论 -
POJ3468 A Simple Problem with Integers(线段树)
题目链接:poj3468思路区间更新:区间加上某个数区间查询:区间和小结1A了。。代码#include <iostream>#include <cstring>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 100000+5;ll tree[maxn<<2];ll add[maxn<<原创 2017-08-16 15:38:13 · 221 阅读 · 0 评论 -
单向链表的创建、节点删除、链表输出、翻转(写法参考计蒜客数据结构课程)
#include <iostream>#include <cstring>using namespace std;class Node{public: int data; Node *next; Node(int first_node){ data = first_node; next = NULL; }};class LinkL原创 2016-06-25 18:46:35 · 749 阅读 · 0 评论 -
单向循环链表(建表、插入、删除、输出)
这个写法部分参考计蒜客,目前正在学习该网站的数据结构课程。 其实,这个写法看得很变扭,我适当的改了一下,感觉还是很变扭,莫非是我改变扭了?。。。这里用插入函数来完成建表,所以插入函数既可以在建表时使用,也可以在建表完成后再进行插入时使用。删节点的函数既可以删除整个表,也可以删除某个节点。 (Ps:这里由于函数有两个用途,所以在删除第一个节点时需要判断,判断删除第一个节点后是否还有节点,如果表已经原创 2016-06-26 16:08:31 · 933 阅读 · 0 评论 -
队列
先来一个计蒜客原版的队列实现(侵权则删)#include <iostream>#include <cassert>using namespace std;class Queue {private: int *data; int head, tail, length;public: Queue(int length_input) { data = ne原创 2016-06-26 21:24:54 · 188 阅读 · 0 评论 -
循环队列
当队列未满,但tail等于length出现假上溢的情况,循环队列就是为了充分利用已开辟的内存空间的一种队列实现方法。特别是要注意出队时,如果pop的是最后一个元素,那么head = (head+1)%length的操作将导致head重新变为0,而tail不变,内存中任存储着原来队列元素的值,所以输出空队列时要加上 if(count==0) 的判断队列输出有还有一个判断,当tail等于length-1原创 2016-06-27 21:59:37 · 257 阅读 · 0 评论 -
哈希表
#include <iostream>#include <cassert>#include <cstdlib>using namespace std;template<class Type> class Stack{private: Type *data; int topIndex, maxSize;public: Stack(int _maxSize){原创 2016-07-01 16:10:48 · 199 阅读 · 0 评论 -
二叉排序树(或二叉查找树)的建立
建立两个类,一个结点类,一个树类,通过树类方法调用结点类的方法递归建树,二叉排序树中序输出得到从小到大排序的数列。为了方便后面的相关操作,类的成员变量中定义一个father来记录父节点。#include <iostream>#include <string>#include <cstdlib>using namespace std;class Node{public: int dat原创 2016-07-05 12:26:42 · 284 阅读 · 0 评论 -
二叉排序树的查找操作
递归查找结点#include <iostream>#include <string>#include <cstdlib>using namespace std;class Node{public: int data; Node *lchild, *rchild, *father; Node(int _data, Node *_father=NULL){原创 2016-07-05 13:16:03 · 642 阅读 · 0 评论 -
二叉排序树的结点删除
8 3 9 2 6 101 4 7 5上面是1到10的二叉排序树。 如何实现二叉排序树的节点删除呢?假设我们删除结点6,先寻找前驱结点或者后继节点,6的前驱结点是5,后继是7,想象一下删除了结点6后,树该怎么变化?其实只要将6改成5,再将5的节点删除就OK了。注意前驱或后继的度为1或者0。(PS:这是从计蒜客学来的,不是打广告,侵权则删)原创 2016-07-05 18:21:36 · 2476 阅读 · 0 评论 -
最小生成树和prim算法
最小生成树:在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得 w(T) 最小,则此 T 为 G 的最小生成树。 最小生成树其实是最小权重生成树的简称 (以上来源百度百科)简单的说就是如何从一个带权图中抽出一棵生成树,使得边权值和最小,这棵生成树就叫做最小生原创 2016-07-19 15:10:19 · 522 阅读 · 0 评论 -
数据结构-二叉堆
堆是一棵完全二叉树。堆按照关键字的设定,分大顶堆和小顶堆,大顶堆指父亲节点关键字比儿子节点都要大,小顶堆指父亲节点关键字比儿子节点要小。数组实现堆的思路:设数组arr[];在arr[0]处设立一个哨兵,大顶堆则赋一个大的数,小顶堆则赋一个小的数。1号节点放置在数字下标为1的位置,其他的以此类推。1号节点的左儿子是2,右儿子是3,根据二叉树的特原创 2016-11-10 01:52:01 · 261 阅读 · 0 评论 -
uvalive 3938 Ray, Pass me the dishes!(线段树)
题目链接:https://vjudge.net/problem/UVALive-3938题意:给一个数组,多次查询,询问区间[l, r]最大连续和。思路:线段树。 查询一个区间的最大连续和,可以找一个mid,这个最大连续和的起点和终点, 可能在mid的左边,或者在mid的右边,或者横跨mid。左区间和右区间的最大值是递归定义的,维护起来也是容易的。横跨mid的最大值如何计算?等于左区间最大后缀+原创 2017-08-08 15:38:22 · 316 阅读 · 0 评论 -
hdu1166 敌兵布阵(线段树)
题目链接:hdu1166 敌兵布阵思路单点更新,增加和减少。区间求和。小结看错题目,写成区间更新...WA了两发,WA在add打懒标记,更新当前节点时,乘以的是懒标记,而不是要更新的那个数。代码#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 50000;in原创 2017-08-16 15:20:23 · 233 阅读 · 0 评论 -
hdu1754 I Hate It
题目链接:hdu1754 I Hate It思路单点更新。区间最大。小结又WA了一发。设查询区间为[QL, QR],当前节点为rt,对应区间为[L, R], mid=(L+R)/2。按照我的写法,当QL小于等于mid时,递归左区间,当QR大于mid时,递归右区间。这里应该是两个if,而我写成了if-else,含义就错了。代码#include <iostream>#include <algori原创 2017-08-16 15:31:56 · 303 阅读 · 0 评论 -
hdu4614 Vases and Flowers (线段树)
题目链接:点击链接题意:有标号从0到n-1的n个花瓶,每个花瓶只能放一朵花。现在有两种操作,操作一,从第a个花瓶开始,放b朵花进入花瓶,如果能放,输出能放的最左边的位置,和最右边的位置,如果不能放,输出不能放。操作二,将花瓶a到花瓶b这个区间内的花全部丢弃。思路:维护区间内花的数量sumv[rt],区间内最左边空花瓶的位置为L[rt],最右边位置为R[rt]。 设花瓶空为0,有花为1,操作一则是要原创 2017-09-12 02:25:55 · 407 阅读 · 0 评论