ACWING
文章平均质量分 54
此处记录的是acwing中部分算法的题解
桜キャンドル淵
凑个整,就1024吧
展开
-
【ACWING】【4655数位排序】
所以我们的核心思路就是:统计我们每一个位置的元素需要被计算几次,然后将我们数组中较大的数排到这几个出现次数更多的位置上去。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。这道题我们的思路就是统计出每一次询问之后,对应位置的元素需要统计多少次。然后我们只要将两个数组对应的位置相乘就能够得到我们的结果。比方说我们上面的的样例中的数据为:1 2 3 4 5。然后我们对我们出现次数的数组进行排序,得到。然后我们也将我们的原数组进行排序,得到。然后我们的两次询问分别为1 3。原创 2023-01-05 19:04:25 · 313 阅读 · 0 评论 -
【ACWING】【4653数位排序】
这道题的解法可以我们直接定义一个compare函数,将我们两个数的比较方法传入,然后直接使用一个sort排序,然后返回对应位置的数据就可以了。例如,2022 排在 409 前面,因为 2022 的数位之和是 6,小于 409 的数位之和 13。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。第 5 个数为 3。原创 2023-01-03 20:48:57 · 154 阅读 · 0 评论 -
【ACWING】【4644求和】
给定 n 个整数 a1,a2,···,an,求它们两两相乘再相加的和,即。我们首先将我们全部的数据加和,我们就能够得到19,也就是我们的sum。然后如果我们想要知道我们全部的数据两两加和的结果的话,这是我们的式子。对于所有评测用例,1≤n≤200000,1≤ai≤1000。对于 30% 的数据,1≤n≤1000,1≤ai≤100。这道题的思路就是我们不妨先观察一下我们题目给的样例。所以我们只需要让我们的s1=1*(sum-1)然后我们的s1+s2+s3就是我们的最终结果。输出一个整数 S,表示所求的和。原创 2023-01-03 20:15:59 · 389 阅读 · 0 评论 -
【ACWING】【4645选数异或】
给定一个长度为 n 的数列 A1,A2,···,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。但是我们要并不知道b^x存不存在于我们传入的数组中,所以我们就需要再创建一个数组last,用来记录我们每一次传入的元素的下标的位置。对于所有评测用例,1≤n,m≤100000,0≤x原创 2023-01-03 19:59:57 · 599 阅读 · 0 评论 -
【ACWING】【Dijkstra】【849Dijkstra求最短路】
接下来 m行每行包含三个整数 x,y,z,表示存在一条从点 x到点 y的有向边,边长为 z。请你求出 1号点到 n号点的最短距离,如果无法从 1号点走到 n号点,则输出 −1。给定一个 n个点 m条边的有向图,图中可能存在重边和自环,所有边权均为正值。1≤n≤500,1≤m≤105,图中涉及边长均不超过10000。输出一个整数,表示 1号点到 n号点的最短距离。如果路径不存在,则输出 −1。第一行包含整数 n 和 m。原创 2023-01-01 20:16:37 · 91 阅读 · 0 评论 -
【ACWING】【图的广度遍历】【848有向图的拓扑顺序】
然后遍历我们的队列,也就是依次从队列中取出一个元素,将其删掉,然后将这个点指向的边也全部都删掉,然后看看删掉之后,有没有新的点的入度为0,如果有的话,就加入我们的队列。然后我们发现没有点可以加入队列了,并且我们的队列在4被pop了之后也空了,此时我们发现vector的大小跟我们数据的个数是相等的,所以我们能够打印出我们的队列。如果我们的vector的大小跟我们的点总数是相等的,那么我们就是可以得到一个拓扑序列的,只要将我们的vector中的内容全部打印出来就可以了。我们1的入度为0,我们就将1加入队列。原创 2023-01-01 17:06:00 · 408 阅读 · 0 评论 -
【ACWING】【4818奶牛大学】
注意这个问题涉及到的整数可能需要使用== 64位整数型==(例如,Java 中的 “long”,C/C++ 中的 “long long”)。然后我们遍历我们的这个map,也就是按照每一个不同的学费档位,看看有多少头奶牛愿意交学费,计算出当前档位能够赚的学费。这道题我们的解题思路就是先用一个map将我们所有奶牛愿意交的大学学费,不同的学费档次有多少桶奶牛愿意交给统计出来。Farmer John 想赚尽可能多的钱,从而可以给他的讲师提供一笔可观的工资。然后我们就能得出我们最多可以获取到的学费的金额。原创 2022-12-31 18:29:48 · 812 阅读 · 0 评论 -
【ACWING】【图的广度遍历】【847图中点的层次】
图的广度遍历就跟我们的二叉树的层序遍历的思路是相同的。首先我们将起始节点放入我们的队列中,然后我们取出队列的头结点,将其可以延伸到的结点放入我们队尾,然后将我们的头结点标记为已经访问过,不能再重复访问。就这样一直循环,直到我们的队列为空,我们就返回-1,或者找到了具体的节点我们返回到点n的最短距离。请你求出 1号点到 n号点的最短距离,如果从 1号点无法走到 n号点,输出 −1。这道题就是考察我们图的广度遍历的知识。输出一个整数,表示 1号点到 n号点的最短距离。所有边的长度都是 1,点的编号为 1∼n。原创 2022-12-31 18:08:35 · 118 阅读 · 0 评论 -
【ACWING】【图的深度优先遍历】【846树的重心】
然后只要我们将总的结点的个数减掉我们这个红圈的节点和s1,s2,s3,我们就能够得到这个红圈的上面的那一块连通图的结点个数。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。当我们每遍历一个结点的时候,我们就将这个去掉这个节点之后,树所剩下的最大的连通块的大小给求出来。比方说我们当前遍历到了我们下面红色圈圈起来的这个节点,我们将其删掉,那么我们需要知道它的三个子树的结点个数。这里我们首先需要确定的是我们的存储图的结构。然后对于每一个节点的。原创 2022-12-31 17:43:34 · 544 阅读 · 0 评论 -
【ACWING】【BFS】【844走迷宫】【845八数码】
给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1)处和 (n,m)处的数字为 0,且一定至少存在一条通路。输入格式第一行包含两个整数 n和 m。接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。输出格式。原创 2022-12-30 17:30:53 · 323 阅读 · 0 评论 -
【ACWING】【4366石子堆合并】
你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a=[1,2,3,4,5],合并第 2,3堆石子,则石子堆集合变为 a=[1,5,4,5]。从前往后遍历我们的vector,如果相邻的石子堆的数量达到了tmp,就说明可以合并了。②然后我们需要从我们最小的元素min1开始逐渐枚举到我们的石子堆的总和sum,取我们指定tmp颗石子为一堆。①这里我们就需要先求出我们全部的石子和是多少,同时将我们的石子堆的个数放入一个vector当中。有 N堆石子,每堆的石子数量分别为 a1,a2,…原创 2022-12-29 21:11:05 · 158 阅读 · 0 评论 -
【ACWING】【4261孤独的照片】
然后寻找每一头奶牛左侧有多少头连续的跟当前这头奶牛不同品种的奶牛l1,以及这头奶牛右边有多少头连续的跟当前这头奶牛不同品种的奶牛r1;然而,他不想拍摄这样的照片,其中只有一头牛的品种是更赛牛,或者只有一头牛的品种是荷斯坦牛——他认为这头奇特的牛会感到孤立和不自然。在为每个连续不少于三头奶牛的序列拍摄了一张照片后,他把所有「孤独的」照片,即其中只有一头更赛牛或荷斯坦奶牛的照片,都扔掉了。③以当前的这头奶牛位照片中中间的奶牛,左边有l1种不同的选择,右边有r1种不同的选择,有l1*r1种不同的孤独的照片。原创 2022-12-28 00:02:33 · 175 阅读 · 0 评论 -
【ACWING】【803区间合并】
②除了情况①之后,也就是排除了l比r1大的情况,也就是在情况②中l肯定会比r1要小,所以我们只需要比较我们的r是不是比我们的r1大就可以了,如果比r1大,我们就更新,如果小,就不更新。①新的元素(区间)的l比我们之前的r1都要大,也就是说我们当前的l1,r1区间已经没有别的区间会与它进行合并了,我们就可以更新我们的l1和r1成l,r,然后让我们的count++如果新传入的l在map中已经存在,就看看要不要更新r,如果r>map[l],也就是比我们原先的记录值要大,我们就更新,否则我们就保留原先的记录。原创 2022-12-27 22:44:50 · 297 阅读 · 0 评论 -
【ACWING】【802区间和】
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。共 m 行,每行输出一个询问中所求的区间内数字和。再接下来 m 行,每行包含两个整数 l 和 r。接下来 n 行,每行包含两个整数 x 和 c。第一行包含两个整数 n 和 m。原创 2022-12-24 20:59:41 · 246 阅读 · 0 评论 -
【ACWING】【799】【800】【2816】【双指针算法】
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。第二行包含 n 个整数,表示 a1,a2,…第二行包含 n 个整数,表示数组 A。原创 2022-12-19 17:47:47 · 77 阅读 · 0 评论 -
【ACWING】【795】【796】【797】【798】【一维前缀和】【二维前缀和】【一维差分】【二维差分】
如果我们调整了x1,y1和点x2,y2之间的数据,我们假设给我们的x1,y1加上了一个5,那么我们x1,,y1右下方的全部矩阵都会加上5,为了将+5的范围限制在x2,y2左上角,我们需要将x2+1,y1这个点减去5,将x1,y2+1这个点减去5,但是这样的话,我们x2+1,y2+1右下角的全部的矩阵都被额外减掉了5,所以我们需要将x2+1,y2+1这个点加上5。也就是说我们想要统计x1,y1左上角的矩阵和,我们的x1,y1=x1,y1-1+x1-1,y1-x1-1,y1-1。原创 2022-12-18 21:40:46 · 80 阅读 · 0 评论 -
【ACWING】【791】【792】【793】【794】【高精度加减乘除】
给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。共两行,第一行包含整数 A,第二行包含整数 B。共两行,第一行包含整数 A,第二行包含整数 B。共两行,第一行输出所求的商,第二行输出所求余数。给定两个正整数(不含前导 0),计算它们的和。共一行,包含 A×B 的值。共两行,每行包含一个整数。共一行,包含所求的和。共一行,包含所求的差。原创 2022-12-17 17:47:44 · 120 阅读 · 1 评论 -
【ACWING】【789】【数的范围(整数二分法)】【790】【数的三次方(浮点数二分法)】
此时我们满足了我们循环跳出的条件, 此时我们无论是返回l还是r都是可以的,并且我们所得到的是我们最右边的那一个x。按照我们模板2的思路,我们的check函数应该就是tmp[mid]原创 2022-12-15 17:28:51 · 83 阅读 · 0 评论 -
【ACWING】【787】【归并排序】【788】【逆序对的个数】
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。请你使用归并排序对这个数列按照从小到大进行排序。输出共一行,包含 n 个整数,表示排好序的数列。给定你一个长度为 n 的整数数列。输入共两行,第一行包含整数 n。并将排好序的数列按顺序输出。通过模板实现归并排序。原创 2022-12-15 15:48:23 · 74 阅读 · 0 评论 -
【ACWING】【786】【第k个数】
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出一个整数,表示数列的第 k 小数。第一行包含两个整数 n 和 k。原创 2022-12-15 15:30:29 · 90 阅读 · 0 评论