
数据结构与算法
算法学习中
Solkatt's
一条立志向大佬学习的咸鱼
展开
-
C++算法题 # 56 01背包问题
题目描述有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wiv_i,w_ivi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000,原创 2022-03-22 12:02:36 · 738 阅读 · 0 评论 -
C++算法题 # 55 最大公约数(欧几里得算法)
题目描述给定 n 对正整数 aia_iai,bib_ibi,请你求出每对数的最大公约数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个整数对 aia_iai,bib_ibi。输出格式输出共 n 行,每行输出一个整数对的最大公约数。数据范围1≤n≤105,1≤ai,bi≤2×1091≤n≤10^5,1≤a_i,b_i≤2×10^91≤n≤105,1≤ai,bi≤2×109输入样例:23 64 6输出样例:32思路辗转相除法,又名欧几里德算法(E原创 2022-03-21 16:45:00 · 3230 阅读 · 0 评论 -
C++算法题 # 54 约数之和
题目描述给定 n 个正整数 aia_iai,请你输出这些数的乘积的约数之和,答案对 109+710^9+7109+7 取模。输入格式第一行包含整数 n。接下来 n 行,每行包含一个整数 aia_iai。输出格式输出一个整数,表示所给正整数的乘积的约数之和,答案需对 109+710^9+7109+7 取模。数据范围1≤n≤100,1≤ai≤2×1091≤n≤100,1≤a_i≤2×10^91≤n≤100,1≤ai≤2×109输入样例:3268输出样例:252思路原创 2022-03-21 14:15:35 · 967 阅读 · 0 评论 -
C++算法题 # 53 约数的个数
题目描述给定 n 个正整数 aia_iai,请你输出这些数的乘积的约数个数,答案对 109+710^9+7109+7 取模。输入格式第一行包含整数 n。接下来 n 行,每行包含一个整数 aia_iai。输出格式输出一个整数,表示所给正整数的乘积的约数个数,答案需对 109+710^9+7109+7取模。数据范围1≤n≤100,1≤ai≤2×1091≤n≤100,1≤a_i≤2×10^91≤n≤100,1≤ai≤2×109输入样例:3268输出样例:12思路本题的原创 2022-03-21 13:38:17 · 1281 阅读 · 0 评论 -
C++算法题 # 52 试除法求约数
题目描述给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个整数 ai。输出格式输出共 n 行,其中第 i 行输出第 i 个整数 ai 的所有约数。数据范围1≤n≤100,2≤ai≤2×1091≤n≤100,2≤a_i≤2×10^91≤n≤100,2≤ai≤2×109输入样例:268输出样例:1 2 3 6 1 2 4 8 思路和上题求因子的类似,从1开始遍历,遍历到sqrt(原创 2022-03-20 19:51:41 · 487 阅读 · 0 评论 -
C++算法题 # 51 筛质数(三种方法)
题目描述给定一个正整数 n,请你求出 1∼n 中质数的个数。输入格式共一行,包含整数 n。输出格式共一行,包含一个整数,表示 1∼n 中质数的个数。数据范围1≤n≤1061≤n≤10^61≤n≤106输入样例:8输出样例:4思路本题如果使用前面的判断每一位数字是否是质数,然后统计总共的计数,我们会发现这样会超时,因为这里包含着大量重复的遍历,这样的时间复杂度为 O(n3/2)O(n^{3/2})O(n3/2)。因此我们需要找到一些性质来优化这个算法:代码示例#includ原创 2022-03-20 18:38:55 · 998 阅读 · 0 评论 -
C++算法题 # 50 分解质因数
题目描述给定 n 个正整数 aia_iai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个正整数 aia_iai。输出格式对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。每个正整数的质因数全部输出完毕后,输出一个空行。数据范围1≤n≤100,2≤ai≤2×1091≤n≤100,2≤a_i≤2×10^91≤n≤100,2≤ai≤2×109输入原创 2022-03-20 15:45:44 · 841 阅读 · 0 评论 -
C++算法题 # 49 试除法判定质数
题目描述给定 n 个正整数 ai,判定每个数是否是质数。输入格式第一行包含整数 n。接下来 n 行,每行包含一个正整数 ai。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100,1≤ai≤231−11≤n≤100,1≤a_i≤2^{31}−11≤n≤100,1≤ai≤231−1输入样例:226输出样例:YesNo思路代码示例#include <iostream>usi原创 2022-03-20 11:26:00 · 512 阅读 · 0 评论 -
C++算法题 # 48 Kruskal算法求最小生成树
题目描述给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。输入格式第一行包含两个整数 n 和 m。接下来 m 行,每行包含原创 2022-03-20 10:44:19 · 217 阅读 · 0 评论 -
C++算法题 # 47 Prim算法求最小生成树
题目描述给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G=(V,E),其中 V 表示图中点的集合,E 表示图中边的集合,n=|V|,m=|E|。由 V 中的全部 n 个顶点和 E 中 n−1 条边构成的无向连通子图被称为 G 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 G 的最小生成树。输入格式第一行包含两个整数 n 和 m。接下来 m 行,每行包含原创 2022-03-19 20:07:59 · 285 阅读 · 0 评论 -
C++算法题 # 46 Floyd求最短路径
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible。数据保证图中不存在负权回路。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。接下来 k 行,每行包含两个整数 x,y,表示询问点 x 到点 y 的最短距离。输出格式共 k 行,转载 2022-03-19 18:01:35 · 931 阅读 · 0 评论 -
C++算法题 # 45 spfa判断负环
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式如果图中存在负权回路,则输出 Yes,否则输出 No。数据范围1≤n≤2000,1≤m≤10000,图中涉及边长绝对值均不超过 10000。输入样例:3 31 2 -12 3 43 1 -4输出样例:Yes思路原创 2022-03-19 17:30:35 · 620 阅读 · 0 评论 -
C++算法题 # 44 spfa求最短路径
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。数据保证不存在负权回路。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 impossible。数据范围1≤n,m≤105,1原创 2022-03-19 16:23:04 · 150 阅读 · 0 评论 -
C++算法题 # 43 有边数限制的最短路(Bellman-Ford 算法)
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。注意:图中可能 存在负权回路 。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。如果不存在满足条件的路径转载 2022-03-18 15:21:39 · 2422 阅读 · 0 评论 -
C++算法题 # 42 Dijkstra求最短路 II(堆优化的Dijkstra算法)
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 −1。数据范围1≤n,m≤1.5×1051≤n,m≤1.5×10^51≤n,m≤1.5×10原创 2022-03-18 09:57:35 · 793 阅读 · 0 评论 -
C++算法题 # 41 Dijkstra求最短路I
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 −1。数据范围1≤n≤500,1≤m≤105,1≤n≤500,1≤m≤10^5,1≤n≤50原创 2022-03-17 00:07:26 · 727 阅读 · 0 评论 -
C++算法题 # 40 有向图的拓扑排序
题目描述给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。输入格式第一行包含两个整数 n 和 m。接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y 的有向边 (x,y)。输出格式共一行,如果存在拓扑序列,则输出任意一个合法的拓扑原创 2022-03-16 17:59:32 · 551 阅读 · 0 评论 -
C++算法题 # 39 图中点的层次
题目描述给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。所有边的长度都是 1,点的编号为 1∼n。请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。输入格式第一行包含两个整数 n 和 m。接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。数据范围1≤n,m≤1051≤n,m≤10^51≤n,m≤105输入样例:4 51 2原创 2022-03-16 15:32:10 · 1335 阅读 · 0 评论 -
C++算法题 # 38 树的重心(树的深度优先遍历)
题目描述给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数 n,表示树的结点数。接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。输出格式输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。数据范围1≤n≤1051原创 2022-03-16 11:38:31 · 633 阅读 · 0 评论 -
C++算法题 # 37 八数码(广度优先遍历)
题目描述在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x 4 6原创 2022-03-15 22:19:27 · 299 阅读 · 0 评论 -
C++算法题 # 36 走迷宫(广度遍历)
题目描述给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫原创 2022-03-13 19:19:49 · 495 阅读 · 0 评论 -
C++算法题 # 35 n-皇后问题(深度遍历)
题目描述n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数 n。输出格式每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意,只要不重复且没有原创 2022-03-13 16:47:01 · 1102 阅读 · 0 评论 -
C++算法题 # 34 排列数字(深度遍历)
题目描述给定一个整数 nnn,将数字 1∼n1∼n1∼n 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数 nnn。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤71≤n≤71≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1思路模板题,很容易理解。代码示例#include <iostream>using namespace std原创 2022-03-11 17:36:11 · 1345 阅读 · 0 评论 -
C++算法题 # 33 字符串哈希
题目描述给定一个长度为 nnn 的字符串,再给定 mmm 个询问,每个询问包含四个整数 l1,r1,l2,r2l1,r1,l2,r2l1,r1,l2,r2,请你判断 [l1,r1][l1,r1][l1,r1] 和 [l2,r2][l2,r2][l2,r2] 这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数 nnn 和 mmm,表示字符串长度和询问次数。第二行包含一个长度为 nnn 的字符串,字符串中只包含大小写英文字母和数字。接下来 mmm 行原创 2022-03-11 16:13:15 · 694 阅读 · 0 评论 -
C++算法题 # 32 模拟散列表
题目描述维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。输出格式对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。每个结果占一行。数据范围1≤N≤10^5−109≤x≤10^9输入样例:5I 1I 2I原创 2022-03-10 23:25:02 · 175 阅读 · 0 评论 -
C++算法题 # 31 模拟堆
题目描述维护一个集合,初始时集合为空,支持如下几种操作:I x,插入一个数 x;PM,输出当前集合中的最小值;DM,删除当前集合中的最小值(数据保证此时的最小值唯一);D k,删除第 k 个插入的数;C k x,修改第 k 个插入的数,将其变为 x;现在要进行 N 次操作,对于所有第 2 个操作,输出当前集合的最小值。输入格式第一行包含整数 N。接下来 N 行,每行包含一个操作指令,操作指令为 I x,PM,DM,D k 或 C k x 中的一种。输出格式对于每个输出指令 PM,输出原创 2022-03-10 19:06:56 · 148 阅读 · 0 评论 -
C++算法题 # 30 堆排序
题目描述输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。输入格式第一行包含整数 n 和 m。第二行包含 n 个整数,表示整数数列。输出格式共一行,包含 m 个整数,表示整数数列中前 m 小的数。数据范围1≤m≤n≤10^5,1≤数列中元素≤10^9输入样例:5 34 5 1 3 2输出样例:1 2 3思路这里是堆排序的基本原理,用数组实现堆的5个基本操作:本题的话,只需要实现第2个功能和第3个功能即可。代码示例#include <iostrea原创 2022-03-10 16:51:28 · 559 阅读 · 0 评论 -
C++算法题 # 29 连通块中点的数量
题目描述给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。现在要进行 m 个操作,操作共有三种:C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;Q2 a,询问点 a 所在连通块中点的数量;输入格式第一行输入整数 n 和 m。接下来 m 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。输出格式对于每个询问指令 Q1 a b,如果 a 和原创 2022-03-10 12:51:41 · 849 阅读 · 0 评论 -
C++算法题 # 28 合并集合
题目描述一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式第一行输入整数 n 和 m。接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。输出格式对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出原创 2022-03-10 12:09:05 · 439 阅读 · 0 评论 -
C++算法题 # 27 最大异或对
题目描述在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231输入样例:31 2 3输出样例:3思路做这种题首先都要知道暴力方法如何去做,然后再进行时间上的优化。以下笔记为acwing视频截图:代码示例暴力:#include <iostream>using n原创 2022-03-09 22:46:40 · 358 阅读 · 0 评论 -
C++算法题 # 26 Trie字符串统计
题目描述维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串x;Q x 询问一个字符串在集合中出现了多少次。共有 N 个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abcQ abc原创 2022-03-09 18:10:13 · 132 阅读 · 0 评论 -
C++算法题 # 25 KMP字符串
题目描述给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串 P。第三行输入整数 M,表示字符串 S 的长度。第四行输入字符串 S。输出格式共一行,输出所有出现位置的起始下标(下标从 0 开始计数),整数之间用空格隔开。数据范围1≤N≤1051≤M≤106输入样例:3ab原创 2022-03-09 17:12:14 · 712 阅读 · 0 评论 -
C++算法题 # 24 滑动串口(单调队列)
题目描述给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k 为 3。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。输入格式输入包含两行。第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。第二行有 n 个整数,代表数组的具体数值。同行数据之间用空格隔开。输出格式输出包含两个。原创 2022-03-08 16:57:13 · 117 阅读 · 0 评论 -
C++算法题 # 23 单调栈
题目描述给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。输入格式第一行包含整数 N,表示数列长度。第二行包含 N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2思路这是一道经典的单调栈的运用,本题只需要一直维持一个单调栈即可。我们会发现,原创 2022-03-07 12:27:32 · 592 阅读 · 0 评论 -
C++算法题 # 22 模拟队列
实现一个队列,队列初始为空,支持四种操作:push x – 向队尾插入一个数 x;pop – 从队头弹出一个数;empty – 判断队列是否为空;query – 查询队头元素。现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。输入格式第一行包含整数 M,表示操作次数。接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。输出格式对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行原创 2022-03-07 10:31:09 · 400 阅读 · 0 评论 -
C++算法题 # 21 模拟栈
实现一个栈,栈初始为空,支持四种操作:push x – 向栈顶插入一个数 x;pop – 从栈顶弹出一个数;empty – 判断栈是否为空;query – 查询栈顶元素。现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。输入格式第一行包含整数 M,表示操作次数。接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。输出格式对于每个 empty 和 query 操作都要输出一个查询结果,每个结果占一行。其中转载 2022-03-06 10:41:22 · 403 阅读 · 0 评论 -
C++算法题 # 20 双链表
实现一个双链表,双链表初始为空,支持 5 种操作:在最左侧插入一个数;在最右侧插入一个数;将第 k 个插入的数删除;在第 k 个插入的数左侧插入一个数;在第 k 个插入的数右侧插入一个数现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。输入格式第一行包含整数 M,表示操原创 2022-03-04 11:16:42 · 130 阅读 · 0 评论 -
C++算法题 # 19 单链表
实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。输入格式第一行包含整数 M,表示操作次数。接下来 M 行,每行包含一个操作命令,操作命令可能原创 2022-03-03 10:17:40 · 118 阅读 · 0 评论 -
C++算法题 # 18 二进制中1的个数
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。输入格式第一行包含整数 n。第二行包含 n 个整数,表示整个数列。输出格式共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。数据范围1≤n≤100000,0≤数列中元素的值≤109输入样例:51 2 3 4 5输出样例:1 1 2 1 2思路首先就要了解什么是lowbit然后根据这个每次找到一次1后就把最后一个1对应的值给减去后继续找倒数第二个1,依原创 2022-03-02 18:14:47 · 537 阅读 · 0 评论 -
常用的二进制相关操作
求n的第k位数字#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;int main(){ int n, k; cin >> n >> k; cout << (n >> k & 1) << endl;//输出n对应的二进转载 2022-03-02 16:15:33 · 243 阅读 · 0 评论