
数据结构
文章平均质量分 61
Lndulge.
一个蒟蒻 OIer
还在努力中 noip加油!
这个博客用来记录笔记和做的题。。
展开
-
[笔记]:[字符串]trie数的基本构造
Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。原创 2017-05-12 10:46:12 · 354 阅读 · 0 评论 -
[poj 3321]:Apple Tree(树状数组/线段树 和dfs序)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29084 Accepted: 8633 Description There is an apple tree outside of kaka’s house. Every autumn, a lot of apples wi原创 2017-05-24 14:08:59 · 1178 阅读 · 0 评论 -
[vijos 1066和1052] 简单树状数组练习题
背景SuperBrother在机房里闲着没事干(再对比一下他的NOIP,真是讽刺啊……),于是便无聊地开始玩“打鼹鼠”…… 描述在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……)。洞口都在一个大小为n(n<=1024)的正方形中。这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1)。洞口所在的位置都是整点,就是横纵坐标都为整数的点原创 2017-05-25 09:33:02 · 569 阅读 · 0 评论 -
[zoj]: 1610 & [poj]: 2777 (颜色覆盖题)
zoj1610 Count the ColorsTime Limit: 2 Seconds Memory Limit: 65536 KB Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones. Your原创 2017-05-29 18:46:01 · 436 阅读 · 0 评论 -
[vijos 1659]: 河蟹王国
河蟹王国 描述 河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀)。每个人都有一个初始的和谐值。羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人。而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一原创 2017-05-29 18:28:49 · 282 阅读 · 0 评论 -
[noip 2012] 换教室(线段树)
借教室 描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj原创 2017-05-29 18:14:15 · 267 阅读 · 0 评论 -
[codevs]: 切水果(线段树)
1299 切水果 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量 数据已重新装配,不会出现OLE错误 时限和数据范围适当修改,避免数据包过大而浪费空间资源输入描述 Input De原创 2017-05-29 17:54:10 · 389 阅读 · 0 评论 -
[codevs]: 线段树练习1-4
题目较多就不贴了^_^ 都是线段树入门模板题 比较简单的题目原创 2017-05-29 17:29:08 · 281 阅读 · 0 评论 -
[hdu&poj&洛谷] 经典线段树练习题
1.hdu1166敌兵布阵#include#include#define maxn 50000int ans;struct node { int left,right,sum; int mid() { return (left+right)>>1; }}tree[maxn*4];void btree(int left,int r原创 2017-06-01 08:10:10 · 798 阅读 · 0 评论 -
[笔记]: RMQ算法(区间查询)
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量转载 2017-06-01 18:06:33 · 418 阅读 · 0 评论 -
[练习] LCA练习1(最基础)
hdu 2586 How Far Away?lca求最短距离(模板题)#include#include#include#include#include#include#define N 40005using namespace std;int n,m;int num=0;int b[2*N],w[2*N],nt[2*N],p[2*N];int fa[N][20],d[N原创 2017-06-02 11:54:52 · 406 阅读 · 0 评论 -
[noip2013] 货车运输(最大生成树+并查集+LCA)
货车运输描述A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。格式输入格式第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。接下来 m 行每行 3 个整数 x、原创 2017-06-02 15:18:30 · 530 阅读 · 0 评论 -
[bzoj2144]: 跳跳棋
2144: 跳跳棋Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 689 Solved: 326[Submit][Status][Discuss]Description跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。我们要原创 2017-06-02 15:53:27 · 563 阅读 · 0 评论 -
[笔记]: LCA最近公共祖先
LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。倍增法求LCA(在线做法) 详细见注释/*LCA(Least Common Ancestors)原创 2017-06-01 11:38:50 · 247 阅读 · 0 评论 -
[笔记]: 树链剖分
树链剖分:对于每个结点 连接子节点多的那个子树的边叫做重边重边连起来成链 叫重链 (不止是只有一条重链) 使用线段树或者其他的数据结构存重链 用此数据结构进行操作 两个dfs操作 : 第一个dfs 求出重链 深度dep数组 父节点fa数组 和每个结点的子结点个数size数组 知道了size才可以求出重链 第二个dfs 连接重链 对于每个重链 重链的标号为第一个结点的编号原创 2017-06-05 16:57:28 · 247 阅读 · 0 评论 -
[笔记]: 并查集
自己总结一下吧 并查集核心的就两个部分一个是查int findf(int x){ return fa[x]==x?x:fa[x]=findf(fa[x]);}一个是并void merge(int x,int y){ fa[findf(x)]=findf(y);}话说 并查集叫并查集就是 并和查啊所以就是找爸爸 找爸爸 并爸爸然后就没了啊转载 2017-06-05 16:49:29 · 345 阅读 · 0 评论 -
[noip 2013]火柴排队(树状数组/线段树 求逆序对)
描述涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ) 2 ,其中 a_ia i 表示第一列火柴中第 i 个火柴的高度,b_ib i原创 2017-05-24 09:36:45 · 291 阅读 · 0 评论 -
[笔记]: 线段树
线段树和树状数组的功能类似 但是比树状数组强大的是线段树可以进行区间的更新操作(不只是单点更新)如把数组1-3加5 或者把数组5-6全部改为4 等等但是线段树的代码量比树状数组要大下面代码/*线段树输入一个数组改变区间l到r 使a数组l到r每个加上d求区间ll到rr的和 样例:101 2 3 4 5 6 7 8 9 105 7 2 1 8 输出42 */#include原创 2017-05-26 11:54:50 · 362 阅读 · 0 评论 -
[笔记]:指针 链表 邻接表
1.指针#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;int main(){ int a; scanf("%d",&a); int *b; *b=a;原创 2017-05-16 15:28:36 · 649 阅读 · 0 评论 -
[笔记]: 前向星
前向星与邻接表都存储图的方式 前向星是一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。/*样例:6 8 1 2 1 1 3原创 2017-05-25 09:13:08 · 912 阅读 · 0 评论 -
[笔记]: 树状数组
主要看图 i往上找就是i+=2^k; 往下就是减 k是i的二进制右边0的个数 2^k 直接等于i&(-i); 传送门:写的很好 总结 首先,明白树状数组所白了是按照二分对数组进行分组;维护和查询都是O(lgn)的复杂度,复杂度取决于最坏的情况,也是O(lgn);lowbit这里只是一个技巧,关键在于明白c数组的构成规律;分析的过程二进制一定要深入人心,当作心目中的原创 2017-05-23 15:31:04 · 269 阅读 · 0 评论 -
[bzoj 1452] Count (树状数组)
传送门 题目描述 输入 输出 样例输入 样例输出 1 2 提示 思路 因为权值最大为100 所以对于每一种权值建一个树状数组 然后维护和查询就不多说了 (PS:输出千万别用cout 我RE了10次 改printf就A了!! QwQ)#include<iostream>#include<cstdio>#include<cstring>using name原创 2017-05-25 11:48:12 · 363 阅读 · 0 评论 -
[openjudge 6263] 布尔表达式(栈)
描述 输入一个布尔表达式,请你输出它的真假值。 比如:( V | V ) & F & ( F | V ) V表示true,F表示false,&表示与,|表示或,!表示非。 上式的结果是F输入 输入包含多行,每行一个布尔表达式,表达式中可以有空格,总长度不超过1000 输出 对每行输入,如果表达式为真,输出”V”,否则输出”F”原创 2017-05-12 19:05:08 · 2876 阅读 · 2 评论 -
[vijos 1425]子串清除
描述我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串。现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作。 格式输入格式输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B。 30%的数据是随机生成的; 50%的数据满足输入文件大小小于300KB; 100%的数据转载 2017-05-15 18:33:13 · 466 阅读 · 0 评论 -
[bzoj 1103] 大都市meg(树状数组和dfs序)
传送门 Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了。 不过,她经常回忆起以前在乡间漫步的情景。昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路。从每个村庄都恰好有一条路径到达村庄1(即比特堡)。并且,对于每个村庄,它到比特堡的路径恰好 只经过编号比它的编号小的村庄。另外,对于所有原创 2017-05-25 18:51:00 · 358 阅读 · 0 评论 -
[bzoj 3155] Preprefix sum(树状数组)
传送门DescriptionInput第一行给出两个整数N,M。分别表示序列长度和操作个数 接下来一行有N个数,即给定的序列a1,a2,….an 接下来M行,每行对应一个操作,格式见题目描述 Output对于每个询问操作,输出一行,表示所询问的SSi的值。Sample Input5 3 1 2 3 4 5 Query 5 Modify 3 2 Query 5Sample Output3原创 2017-05-25 15:10:55 · 276 阅读 · 0 评论 -
[洛谷 2580] 于是他错误的点名开始了 (字典树)
题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)输入输出格式输入格式: 第一行一个整数 n,表示班上原创 2017-05-16 09:50:08 · 528 阅读 · 0 评论 -
[poj 2001] Shortest Prefixes(tire树的简单应用)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18363 Accepted: 7962原创 2017-05-12 15:29:30 · 389 阅读 · 0 评论 -
[笔记]: 二叉树 遍历转换
遍历命名 根据访问结点操作发生位置命名: ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历)) ——访问根结点的操作发生在遍历其左右子树之前。 (中 左 右) ② LNR:中序遍历(Inorder Traversal) ——访问根结点的操作发生在遍历其左右子树之中(间)。 (左 中 右) ③ LRN:后序遍历(Postorder Traversal)原创 2017-05-16 19:55:20 · 519 阅读 · 0 评论 -
[noip 2004普及组] FBI树
描述我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。 FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下: 1) T的根结点为R,其类型与串S的类型相同; 2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和原创 2017-05-17 14:29:59 · 519 阅读 · 0 评论 -
[笔记]: 哈弗曼树(最优二叉树)
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼树(霍夫曼树)又称为最优树. 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第原创 2017-05-17 16:38:53 · 468 阅读 · 0 评论 -
[笔记]: 二叉排序树
二叉排序树: 二叉树中每个数都有 左结点小于根结点小于右结点 二叉排序树的中序遍历就是结点的data从小到大排序 建树过程: 对于每个结点 从根结点出发 如果大于结点就往右走 小于就往左走 如走到一个结点为空 则将此结点建入树 /* 如输入 31524 树为 3 1原创 2017-05-18 09:34:12 · 407 阅读 · 0 评论 -
[笔记]: 树转二叉树
给出一个多叉树 那么怎么将树转换为一个二叉树呢?/*树-->二叉树 给出一棵树 将此树转化为二叉树采用兄弟表示法 如给出: A B C D E F转化为: A B E C F D转换方法将 树的 最左结点作为二叉树的左节点 从第二个结点开始(左节点的兄弟) 作为二叉数中的右儿子 如例子中的 c是b的兄弟 所原创 2017-05-18 10:22:57 · 326 阅读 · 0 评论 -
NOI2016区间
传送门题解 Step 1 首先想如果知道了是哪些区间 怎么判断使得这 m个区间共同包含至少一个位置呢方法:区间打标记每次给一个区间,就把这个区间的值+1 如果有一个地方超过了m次,显然m个区间至少共同包含一个位置 这个时候就需要一个可以支持区间修改,查询区间最大值的数据结构那么就是线段树了 Step 2 如何知道选那些区间呢?首先对于每个区间 [L,R原创 2017-07-21 14:35:43 · 558 阅读 · 0 评论