
数据结构
S atur
要变成萤火虫~
展开
-
L2-006 树的遍历(中后序确定二叉树&层序遍历)
代码实现:#include<bits/stdc++.h>#define int long long#define endl '\n'using namespace std;const int N = 1e5+10;int n, cnt;int bk[N], md[N];map<int, int> pos;struct node{ int lson, rson, val;}tree[N];int build(int la, int lb, ...原创 2022-04-22 23:25:18 · 450 阅读 · 0 评论 -
L2-004 这是二叉搜索树吗?(先序输入&判断搜索二叉树&后序输出)
思路:由于时具有单调性的先序遍历,当出现单调性的结束位置便是左子树 -> 右子树(或右子树 -> 左子树)的转换。参考博客代码实现:#include<bits/stdc++.h>#define int long long#define endl '\n'using namespace std;const int N = 1e5+10;int n, a[N], mirror;vector<int> ans;void dfs(int l...原创 2022-04-21 17:01:25 · 1015 阅读 · 0 评论 -
J. 天空之城 (并查集求最短路) (2021牛客寒假算法基础集训营6)
传送门思路:根据题意显然知道可以利用并查集来求解,如若所有城市都在一个集合内,则表明能通往每个城市。该题明确说明走过的路再走不会再花时间,那么利用并查集再简单不过,只不过在最开始选择路径时需要选择耗时最少的路,因此我们可以利用一个结构体排序来筛选一下。(注意备注里有提到该题时多组输入题型。)代码实现:#include<bits/stdc++.h>//#define endl '\n'#define null NULL#define ll long lon.原创 2021-03-06 10:50:23 · 190 阅读 · 0 评论 -
Codeforces D. Secret Passwords (并查集 / 字符串分组)
传送门题意: 给定n个字符串。如果存在一个或多个字母同时在字符串a和b中出现, 这a和b就被分在同一组如果a和c在同一组 b和c在同一组, 则aa和bb也在同一组问所有的字符串最后被分成几组?思路:基本原理:利用并查集维护下字符集合。把每一个字母当成一个点,对于每一个给出的字符串,把字符串中的所有字母之间都连上边。这样,若两个字符串有公共的字母,他们就一定在一个连通块内,最后求出连通块个数就是答案。代码实现:#include<bits/stdc++.h>#defin原创 2020-08-22 01:06:09 · 233 阅读 · 0 评论 -
Codeforces C. Ehab and Path-etic MEXs (树 / 构造 / MEX)
传送门题意: 给定一个 n 个节点 n−1 条边的树,要求给边重新标注边权,分别为 0,1,2…n-20,1,2…n−2 。然后使得树上任意两点 u,v的 MEX(u,v) 的最大值最小。MEX(u,v) : u 到 v 的简单路径没有出现的自然数中最小的数。思路:当这棵树是一条链时,便可随机构造,ans(min)都是n-2。会发现无论如何构造,边权为 0,1 的两条边总能出现在某条路径上;所以我们只需要考虑如何使得边权为 0,1,2 的三条边不同时出现在某一路径上。因为当这棵树不为一条链时原创 2020-08-18 22:32:37 · 289 阅读 · 0 评论 -
Codeforces D. Cow and Snacks (并查集 / dfs)
传送门题意: 现有n 种花,k 个客人,每个人喜欢两种编号不同的花。但是每种花在花店里只有一束。客人将按一定顺序进入花店买走所有她喜欢且仍在店铺里的花。如果一个客人买不到任何一束花,那么她就会十分沮丧导致变成肥宅。现在你可以自己安排这 n 个人的顺序,使得肥宅的数量最小。思路:将两种花看做点,把客人看做连接两个节点的边,以此建图来具体化问题。对于一个含x个节点的连通块,总有一个边会占据两个点,那么便一定能以一定顺序最多满足x-1条边有点可分配。那么对于所有n个点,若有c个连通块,便会产生c个原创 2020-08-18 19:04:28 · 263 阅读 · 0 评论 -
Codeforces A. String Transformation 1 (字符串构造 / 并查集)
传送门题意: 给出两个(由前20小写字符组成的)字符串a和b,每次你可选择a中几个某一类字符x,将其变成字符y(要求y > x),试问最少需要多少次操作才能将字符串a变成b。思路:第一个样例 aab和bcc,由于第一个a要变成b,第二个a要变成c第二个a要变成c,第三个b要变成c第三个b要变成c,原则上是需要三次操作;但是由于a−>b,b−>c,所以a−>c的步骤就不需要了。这意味着如果合并的两个字母不在一个集合中,才需要额外操作,所以我们直接用并查集维护下即可。代码原创 2020-08-17 22:54:47 · 259 阅读 · 0 评论 -
1003. Covid (思维 / 小根堆)(2020年百度之星*程序设计大赛-初赛二)
传送门思路:比赛的时候想到用并查集,但发现变量很多不知道怎么实现,一直打不出。官方题解:(小根堆代码现还不知道怎么实现,后期若写出再补充!)后面看了wyh的代码才知道其实这个题很简单。直接用个三维数组,第一维记录时间,第二维记录地点,第三维当然就是记录人员编号了。然后以<时间,地点>为索引来处理,具体细节见代码。(比赛是我就傻傻的以人头为索引来处理,结果后面发现这样处理会不完全。)代码实现:#include<bits/stdc++.h>us原创 2020-07-25 23:21:38 · 224 阅读 · 0 评论 -
SCPC :RGB (思维 / 线段树/求最大区间和)
传送门题意:给你一个字符串。字符串由:‘R’ , ‘G’ , ‘B’ 组成。找一个区间,使得能获得的价值最大。价值计算公式:5 * r - 3 * g + br , g , b 分别为字符 R , G , B 的个数。输入:第一行输入一个 N 为字符串长度。第二行输入一个长度为 N 的字符串。0 <= N <= 1000000输出:输出能获得的最大价值。输入样例 13RBG输出样例 16提示选择区间[ 1 , 2 ] 价值最大为 5 + 1 = 6.思路1原创 2020-06-15 18:32:55 · 233 阅读 · 0 评论 -
HDU1542 Atlantis (线段树 / 求总面积)
传送门题意: 给出许多岛屿的坐标,试求出所有岛屿的总面积(岛屿面积的并)。输入:描绘了每张地图时,包含四个数字x1,y1,x2,y2(不一定是整数),(x1,y1)和(x2,y2)分别是地图的左上角位置和右下角位置。且注意,坐标轴 x 轴从上向下延伸,y 轴从左向右延伸。当输入用例n=0时,表示输入终止,该用例无需处理。1≤n≤10000,0≤x1<x2≤100000,0≤y1<y2≤100000注意,本题 n的范围上限加强至 10000。输出:第一行输出”Test case原创 2020-06-08 18:52:14 · 216 阅读 · 0 评论 -
HDU 1540 Tunnel Warfare (线段树 / 求最大连续区间长度)
传送门题意: 抗日战争时期,华北平原广大地区进行了广泛的隧道战争。一般来说,通过隧道连接的村庄成一直线。除了两端的两个村外,每个村庄都与两个相邻的村直接相连。入侵者经常对一些村庄发动袭击,并摧毁其中的部分隧道。八路军指挥官要求提供隧道和村庄的最新连接状态。如果某些村庄被严重隔离,则必须立即恢复连接!输入:输入的第一行包含两个正整数n和m(n,m≤50,000),表示村庄和事件的数量。接下来的m行中的每行都描述一个事件。下面以不同的格式描述了三个不同的事件:D x:第x个村庄被摧毁。问:陆军司令原创 2020-06-07 22:43:34 · 217 阅读 · 0 评论 -
dfs : 树的重心
题目入口给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值的最小值,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个...原创 2020-05-05 00:04:41 · 313 阅读 · 0 评论 -
树状数组模板:洛谷P3374,P3368
题目链接:https://www.luogu.com.cn/problem/list?keyword=%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84&page=1P3374更新单点值,求区间和输入 #15 51 5 4 2 31 1 32 2 51 3 -11 4 22 1 4输出 #11416AC代码:#include<bit...原创 2020-01-08 17:53:41 · 202 阅读 · 0 评论 -
线段树 / 树状数组:一个简单的整数问题2(区间修改 / 求区间和)
题目链接题意:给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。2、“Q l r”,表示询问 数列中第 l~r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数N,M。第二行N个整数A[i]。接下来M行表示M条指令,每条指令的格式如题目描述所示。输出格式对于每...原创 2020-02-07 23:33:01 · 319 阅读 · 0 评论 -
线段树:你能回答这些问题吗(单点修改 / 求最大连续区间和)
题目链接题意:给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤y{∑ri=lA[i]}。2、“2 x y”,把 A[x] 改成 y。对于每个查询指令,输出一个整数表示答案。输入格式第一行两个整数N,M。第二行N个整数A[i]。接下来M行每行3个整数k,x,y,k=1表示查询(此时如果...原创 2020-02-07 22:40:09 · 332 阅读 · 0 评论 -
线段树:最大数(单点修改 / 求区间最大值)
题目链接题意:给定一个正整数数列 a1,a2,…,an,每一个数都在 0∼p−1 之间。可以对这列数进行两种操作:添加操作:向序列后添加一个数,序列长度变成 n+1;询问操作:询问这个序列中最后 L 个数中最大的数是多少。程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。输入格式第一行有两个正整数 m,p,意义如题目描述;接下来 m 行,每一行表示...原创 2020-02-07 18:31:57 · 585 阅读 · 0 评论 -
堆:数据备份
题目https://www.acwing.com/problem/content/description/149/题意:有n+1栋楼,每相邻两两配对搭一条电缆,现资源k条电缆,问选哪k对消耗最小。(一栋楼不难同时被两栋或以上的其他楼相连)数据范围2≤n≤100000,1≤k≤n/2,0≤s≤1000000000输入样例:5 2134612输出样例:4思路:这道题目我们...原创 2020-01-31 21:50:04 · 164 阅读 · 0 评论 -
堆:洛谷1392取数
题目链接:https://www.luogu.com.cn/problem/P1392题意:在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和。对于给定的数阵,请你输出和前k小的取数方法。输入 #3 3 21 2 36 3 54 1 2输出 #5 6思路:哈哈~显然这个题和acwing上的序列那道堆题一样的嘛。代码实现:#include <...原创 2020-01-31 21:04:13 · 267 阅读 · 0 评论 -
堆:荷马史诗
题目链接:https://www.acwing.com/problem/content/151/题意:原题比较繁琐,总体意思和合并果子一样,只不过是每次最大合并k个而不是两个。思路:最多合并k个不一定每次都能合并k个,那么我们让最小的几个先不满足k个合并,之后的合并都是k个结合,那么得到的结果回最小。代码实现:#include <iostream>#include <a...原创 2020-01-31 20:38:04 · 177 阅读 · 0 评论 -
堆:合并果子
题目链接:https://www.acwing.com/problem/content/150/题意:在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。达达决定把所有的果子合成一堆。每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的...原创 2020-01-31 19:53:12 · 1979 阅读 · 1 评论 -
堆:序列
题目链接:https://www.acwing.com/problem/content/148/题意:给定m个序列,每个包含n个非负整数。现在我们可以从每个序列中选择一个数字以形成具有m个整数的序列。很明显,我们一共可以得到n^m个这种序列, 然后我们可以计算每个序列中的数字之和,并得到n^m个值。现在请你求出这些序列和之中最小的n个值。数据范围0<m≤1000,0<n≤20...原创 2020-01-30 23:51:36 · 939 阅读 · 0 评论 -
堆:超市
题目链接:https://www.acwing.com/problem/content/147/题意:超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品(即当天di<=0)不能再卖。求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。数据范围0≤N≤10000,1≤pi,di≤10000输入样例:4 50 2 10 1 20 2 ...原创 2020-01-30 23:15:51 · 211 阅读 · 0 评论 -
洛谷 P3378 【模板】堆
题目链接:https://www.luogu.com.cn/problem/P3378初学选手的堆类模板题,这里就用数组模拟堆操作。代码实现:#include<iostream>using namespace std;const int N = 1e6 + 5;int n, size;int h[N];void down(int u){ int t = ...原创 2020-01-30 17:12:17 · 226 阅读 · 0 评论 -
堆:模拟堆
题目链接:https://www.acwing.com/problem/content/841/题意:维护一个集合,初始时集合为空,支持如下几种操作:1,“I x”,插入一个数x;2,“PM”,输出当前集合中的最小值;3,“DM”,删除当前集合中的最小值(数据保证此时的最小值唯一);4,“D k”,删除第k个插入的数;5,“C k x”,修改第k个插入的数,将其变为x;现在要进行N次...原创 2020-01-27 20:22:59 · 296 阅读 · 1 评论 -
堆:堆排序
题目链接:https://www.acwing.com/problem/content/840/题意:输入一个长度为n的整数数列,从小到大输出前m小的数。数据范围1≤m≤n≤1e5,1≤数列中元素≤1e9输入样例:5 34 5 1 3 2输出样例:1 2 3思路:代码实现:...原创 2020-01-27 17:38:32 · 177 阅读 · 0 评论 -
并查集:食物链(带权并查集)
题目链接:https://www.acwing.com/problem/content/242/题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。...原创 2020-01-26 21:51:54 · 773 阅读 · 0 评论 -
并查集:连通块中点的数量
题目链接:https://www.acwing.com/problem/content/839/题意:给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种:1,“C a b”,在点a和点b之间连一条边,a和b可能相等;2,“Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等;3,“Q2 a”,询问点a所在连通块中点的数量;数据范...原创 2020-01-26 19:53:19 · 454 阅读 · 0 评论 -
并查集:合并集合
题目链接:https://www.acwing.com/problem/content/838/题意:一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:1,“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;2,“Q a b”,询问编号为a和b的两个数是否在同一个集合中;数据范围1≤n,m≤1e5...原创 2020-01-26 17:53:28 · 441 阅读 · 0 评论 -
栈 / 卡特兰数:火车进出栈问题
题目链接:https://www.acwing.com/problem/content/132/题意:一列火车n节车厢,依次编号为1,2,3,…,n。每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种。数据范围1≤n≤60000输入样例:3输出样例:5思路:进出栈问题–>序列问题–>路径问题。这显然是上一道火车进栈的升级版,数据太大不能再进行递...原创 2020-02-02 16:35:11 · 915 阅读 · 1 评论 -
栈:直方图中最大的矩形
题目链接:https://www.acwing.com/problem/content/133/题意:直方图是由在公共基线处对齐的一系列矩形组成的多边形。矩形具有相等的宽度,但可以具有不同的高度。例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1:通常,直方图用于表示离散分布,例如,文本中字符的频率。现在,请你计算在公共基线处对齐的直方图中最大矩...原创 2020-02-01 21:49:12 · 264 阅读 · 0 评论 -
栈:火车进栈
题目链接:https://www.acwing.com/problem/content/131/题意:这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。也就是说这个火车站其实就相当于一个栈,每次可以让右侧...原创 2020-02-01 20:59:04 · 631 阅读 · 0 评论 -
栈:编译器
题目链接:https://www.acwing.com/problem/content/130/题意:你将要实现一个功能强大的整数序列编辑器。在开始时,序列是空的。编辑器共有五种指令,如下:1、“I x”,在光标处插入数值x。2、“D”,将光标前面的第一个元素删除,如果前面没有元素,则忽略此操作。3、“L”,将光标向左移动,跳过一个元素,如果左边没有元素,则忽略此操作。4、“R”,将光标...原创 2020-02-01 18:34:01 · 306 阅读 · 0 评论 -
栈:包含min函数的栈
题目链接:https://www.acwing.com/problem/content/90/题意:设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例:MinStack minStack = new MinStack();mi...原创 2020-02-01 16:38:42 · 186 阅读 · 0 评论 -
单调栈(数组模拟)
题目链接:https://www.acwing.com/problem/content/832/题意:给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2思路:对于这种题显然是可以暴力解决的,但要是想要优化一下就得思考一下。本题的意思是找到离某...原创 2020-01-25 15:31:03 · 226 阅读 · 0 评论 -
模拟栈
题目链接:https://www.acwing.com/problem/content/830/题意:实现一个栈,栈初始为空,支持四种操作:(1) “push x” – 向栈顶插入一个数x;(2) “pop” – 从栈顶弹出一个数;(3) “empty” – 判断栈是否为空;(4) “query” – 查询栈顶元素。现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。...原创 2020-01-22 22:31:41 · 284 阅读 · 0 评论 -
Hash:兔子与兔子
题目链接:https://www.acwing.com/problem/content/140/题意:很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的 DNA 序列。我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母)。然后我们每次选择两个区间,询问如果用两个区间里的 DNA 序列分别生产出来两只兔子,这两个兔子是否一模一样...原创 2020-02-02 21:55:00 · 430 阅读 · 0 评论 -
Hash:雪花雪花雪花
题目链接:https://www.acwing.com/problem/content/139/题意:有N片雪花,每片雪花由六个角组成,每个角都有长度。第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6。因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。如果不存在两片形状相同的雪花,则输出:No tw...原创 2020-02-02 21:17:07 · 482 阅读 · 0 评论 -
哈希表:字符串(前缀哈希法)
题目链接:https://www.acwing.com/problem/content/843/题意:给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。且字符串中只包含大小写英文字母和数字。数据范围1≤n,m≤1e5输入样例:8 3aabbaabb1 3 5 71 3...原创 2020-01-27 23:15:54 · 2021 阅读 · 3 评论 -
哈希表:模拟散列表
题目链接:https://www.acwing.com/problem/content/842/题意:维护一个集合,支持如下几种操作:1,“I x”,插入一个数x;2,“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。如果x在集合中出现过,则输出“Yes”,否则输出“No”。数据范围1≤N≤1e5−109≤x≤1e9输入样例:5I 1...原创 2020-01-27 22:26:08 · 196 阅读 · 0 评论 -
队列:蚯蚓
题目链接:https://www.acwing.com/problem/content/135/题意:蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有 n 只蚯蚓,第 i 只蚯蚓的长度为 ai ,所有蚯蚓的长度都是非负整数,即可能存在长度为0的蚯蚓。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只,将其切成两段。若有多...原创 2020-02-04 12:39:25 · 270 阅读 · 0 评论