- 博客(36)
- 收藏
- 关注
原创 AcWing803 区间合并(区间贪心)
题目:AcWing803 区间合并题解目录前言一、题目陈述二、解决思路三、代码实现总结前言区间贪心问题,想到排序。一、题目陈述二、解决思路将所有区间按照起点排序,然后进行贪心。三、代码实现#include<iostream>#include<algorithm>using namespace std;typedef pair<int,int> PII;const int N=10010;vector<PII> segs;int
2021-02-19 22:25:21
480
原创 AcWing802 区间和(离散化、二分、前缀和)
题目:AcWing802 区间和题解目录前言一、题目陈述二、解决思路三、代码实现总结前言实际利用的位置的数量远小于值域,必须进行离散化,在离散化中,其实是利用二分找到对应的位置。一、题目陈述二、解决思路利用二分进行离散化,进行查询操作之前,求前缀和。三、代码实现#include<iostream>#include<vector>#include<algorithm>using namespace std;const int N=300010;
2021-02-19 22:17:25
623
原创 AcWing801 二进制中1的个数(位运算)
题目:AcWing801 二进制中1的个数题解目录前言一、题目陈述二、解决思路三、代码实现总结前言位运算的作用不可忽视。求数字n的第k位数字: n >> k & 1返回数字n的最低一位1后面跟着一堆0:lowbit(n) = n & -n一、题目陈述二、解决思路每次利用lowbit操作取出最低位的1减去,直到减为0。三、代码实现#include<iostream>using namespace std;const int N = 1e5
2021-02-19 21:57:37
380
原创 AcWing2816 判断子序列(双指针、子串)
题目:AcWing2816 判断子序列题解目录前言一、题目陈述二、解决思路1.双指针算法可以找到一种匹配方式2.若存在一种匹配三、代码实现总结前言双指针算法在实际场景中非常实用,对于某些看似需要O(n^2)的时间复杂度才可以解决的问题,我们可以利用题目场景对应的某种特殊的单调性对算法进行优化,让时间复杂度巧妙地降到O(n)。for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j
2021-02-19 20:55:34
358
原创 AcWing800 数组元素的目标和(双指针)
题目:AcWing800 数组元素的目标和题解目录前言一、题目陈述二、解决思路三、代码实现总结前言双指针算法在实际场景中非常实用,对于某些看似需要O(n^2)的时间复杂度才可以解决的问题,我们可以利用题目场景对应的某种特殊的单调性对算法进行优化,让时间复杂度巧妙地降到O(n)。for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}//
2021-02-19 18:57:16
373
原创 AcWing799 最长连续不重复子序列(双指针、哈希)
题目:AcWing799 最长连续不重复子序列题解目录前言一、题目陈述二、解决思路三、代码实现总结前言双指针算法在实际场景中非常实用,对于某些看似需要O(n^2)的时间复杂度才可以解决的问题,我们可以利用题目场景对应的某种特殊的单调性对算法进行优化,让时间复杂度巧妙地降到O(n)。for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}
2021-02-19 18:21:51
307
原创 AcWing795 前缀和;AcWing796 子矩阵的和;AcWing797 差分;AcWing798 差分矩阵(前缀和、差分)
题目:AcWing795 前缀和;AcWing796 子矩阵的和;AcWing797 差分;AcWing798 差分矩阵题解目录前言一、题目陈述二、解决思路三、代码实现1.前缀和2.二维前缀和3.差分4.二维差分总结前言一、题目陈述二、解决思路三、代码实现1.前缀和int a[N+10];int s[N+10];s[i]=s[i-1]+a[i];while(m--) { scanf("%d%d",&l,&r); printf("%d\n",s[r]-s[
2021-02-18 10:22:24
560
原创 AcWing791~794 高精度(高精度)
题目:AcWing791~794 高精度题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路使用vector数组模拟存储和计算以实现高精度加减乘除。三、代码实现//A+B 其中len(A或B)<=1e6vector<int> add(vector<int> &A,vector<int> &B) { vector<int> C; if(A.size()<B.size()
2021-02-18 09:44:08
211
原创 AcWing789 数的范围(二分)
题目:AcWing789 数的范围题解目录前言一、题目陈述二、解决思路三、代码实现总结前言二分搜索有两种模板,一种是找到有序数组中大于等于base的最小值,另一种是找到有序数组中小于等于base的最大值。一、题目陈述给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内)
2021-02-18 09:37:08
355
原创 AcWing785 快速排序;AcWing786 第k个数;AcWing787 归并排序;AcWing788 逆序对的数量(快速排序、快速选择、归并排序、求逆序对数量)
题解目录前言一、题目陈述二、解决思路三、代码实现1. 快速排序2.快速选择3.归并排序4.归并排序求逆序对数量总结前言两种重要的排序算法,重点掌握他们的思想,以及各自的典型应用场景。一、题目陈述如题。二、解决思路见各自代码。三、代码实现1. 快速排序void quick_sort(int l,int r) { if(l>=r) return; int x=p[l+r>>1]; int i=l-1; int j=r+1; while
2021-02-18 09:20:13
229
原创 AcWing861 二分图的最大匹配(二分图、二分图最大匹配、匈牙利算法)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-18 00:04:12
366
原创 AcWing860 染色法判定二分图(二分图、二分图判定、染色法)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-17 23:38:26
199
原创 AcWing859 Kruskal算法求最小生成树(最小生成树、kruskal)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-17 23:09:37
202
原创 AcWing858 Prim算法求最小生成树(最小生成树、prim)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-17 22:48:12
346
原创 AcWing854 Floyd求最短路(最短路、多源汇最短路、floyd)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现#include<iostream>using namespace std;const int N=210,INF=0x3f3f3f3f;int n,m,Q;int d[N][N];void floyd() { for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++
2021-02-17 21:36:47
372
原创 AcWing852 spfa判断负环(最短路、判断负环、spfa)
题目:AcWing852 spfa判断负环题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现//dist 数组是当前1号点到n号点的最短距离//cnt 数组 表示当前最短路的边数////每次更新的时候,维护两个数组://dist[x]=dist[t]+w[i];//cnt[x]=cnt[t]+1; //如果某次维护的过程中,发现cnt[x]>=n,说明1到x的最短路中//经过了n+1个点,根据抽屉原理,一定至少有两个点相同,即存在
2021-02-17 21:31:09
330
原创 AcWing851 spfa求最短路(最短路、spfa)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-17 10:02:13
267
1
原创 AcWing853 有边数限制的最短路(最短路、k短路、Bellman-Ford)
题目:AcWing853 有边数限制的最短路题解目录前言一、题目陈述二、解决思路三、代码实现总结前言有负权边的最短路问题可以用Bellman-Ford算法,特别是可以解决最多经过k条边的最短路问题。一、题目陈述二、解决思路三、代码实现#include<iostream>#include<cstring>using namespace std;const int N =510,M=10010;int n,m,k;int dist[N],backup[N];
2021-02-17 09:31:41
377
原创 AcWing850 Dijkstra求最短路 II(最短路、堆优化Dijkstra)
题目:题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现总结
2021-02-16 21:50:14
132
原创 AcWing849 Dijkstra求最短路 I(最短路、朴素Dijkstra)
题目:AcWing849 Dijkstra求最短路 I题解目录前言一、题目陈述二、解决思路三、代码实现总结前言一、题目陈述二、解决思路三、代码实现#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 510;int n,m;// 邻接矩阵的数据结构 int g[N][N];// 表示目前1号点到n号点的距离 int d
2021-02-16 16:50:44
380
原创 AcWing848 有向图的拓扑序列(BFS、拓扑排序)
题目:AcWing848 有向图的拓扑序列题解目录前言一、题目陈述二、解决思路三、代码实现总结前言BFS搜索图的应用除了求最短路,还有求拓扑序列。可以证明,一个有向无环图一定存在一个拓扑序列,所以说有向无环图也被称为拓扑图。出度的值为以点u为起点的边的数量。入度的值为以点v为终点的边的数量。一个有向无环图,必然包含入度为0的点(反证法+抽屉原理证明)。一、题目陈述给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出
2021-02-15 11:31:23
548
原创 AcWing847 图中点的层次(BFS、树和图的遍历、最短路)
题目:AcWing847 图中点的层次题解目录前言一、题目陈述二、解决思路三、代码实现总结前言当图中边权都一样的时候,可以用BFS搜索来求最短路问题。一、题目陈述给定一个n个点m条边的有向图,图中可能存在重边和自环。所有边的长度都是1,点的编号为1~n。请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。输出格式输出一个整数,表示1号点到n号点的最短距离。
2021-02-15 10:43:56
292
原创 AcWing846 树的重心(DFS、树和图的遍历)
题目:AcWing846 树的重心题解目录前言一、题目陈述二、解决思路三、代码实现总结前言树,即连通无环图,它是一种特殊的图。无向图是特殊的有向图。邻接矩阵和邻接表都可以存储图。邻接矩阵适用于稠密图。领接表适用于稀疏图。我们可以用DFS和BFS遍历图的存储结构。一、题目陈述给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这
2021-02-15 10:23:20
430
原创 AcWing844 走迷宫(BFS)
题目:AcWing844 走迷宫题解目录前言一、题目陈述二、解决思路三、代码实现总结前言BFS模板题。一、题目陈述给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数
2021-02-14 21:06:21
280
原创 AcWing843 n-皇后问题(DFS)
题目:AcWing843 n-皇后问题题解目录前言一、题目陈述二、解决思路三、代码实现总结前言DFS模板题目。一、题目陈述n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆
2021-02-14 20:27:57
190
原创 AcWing842 排列数字(DFS)
题目:AcWing842 排列数字题解目录前言一、题目陈述二、解决思路三、代码实现总结前言DFS对应一颗搜索树,其空间复杂度低,搜索特点是“不撞南墙不回头”。一、题目陈述二、解决思路使用DFS进行搜索。三、代码实现#include<iostream>using namespace std;const int N = 10;// path数组记录当前方案 int path[N];// st[i]值为false代表i在目前方案中还没有被选择 bool st[N];i
2021-02-14 18:22:48
342
原创 AcWing125 耍杂技的牛(贪心,推公式)
题目:AcWing125 耍杂技的牛题解目录前言一、题目陈述二、解决思路1.ans小于等于cnt不证自明2.ans大于等于cnt的证明过程三、代码实现总结前言一、题目陈述农民约翰的N头奶牛(编号为1…N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这N头奶牛中的每一头都有着自己的重量Wi以及自己的强壮程度Si。一头牛支撑不住的可
2021-02-14 16:03:50
264
原创 AcWing104 货仓选址(贪心、绝对值不等式)
题目:AcWing104 货仓选址题解目录前言一、题目陈述二、解决思路1.两个点的情况2.多个点的情况三、代码实现总结前言在对贪心问题进行求解时,直觉固然重要,但是因为贪心研究的问题都是数学上已经研究过的结论,所以要多掌握数学上的不等式内容,然后利用这些数学知识推导出贪心公式,才能说服自己,也能说服别人。这道货仓选址的贪心题目,具有非常强的实际意义,能够正确指导我们选择合适的货舱位置,使得能源消耗最小。一、题目陈述二、解决思路1.两个点的情况已知直线上a、b两点,求数轴上的一个位置x,使
2021-02-14 12:04:20
373
原创 AcWing913 排队打水(贪心)
题目:AcWing913 排队打水题解目录前言一、题目陈述二、解决思路1.打水次序安排2.求总等待时间三、代码实现总结前言贪心问题最常用的证明方法还是反证法。一、题目陈述二、解决思路1.打水次序安排假设排序为t1 t2 t3 ... tn,则总的等待时间为:t1*(n-1)+t2*(n-2)+...+tn*0,容易看出,为了让总的等待时间最小,必须让每个人的打水时间从小到大排序,打水时间最长的应该在最后打水。2.求总等待时间如果先求前缀和在累加,会多出很多运算量。不如直接利用公式t1
2021-02-14 11:05:44
394
1
原创 AcWing148 合并果子(哈夫曼贪心、优先队列)
题目:AcWing148 合并果子题解目录前言一、题目陈述二、解决思路三、代码实现总结前言哈夫曼编码的结果是让各个使用频率不同的字符编码长度最小。合并果子这道题目可以合并非相邻的果子,自然是使用哈夫曼贪心。一、题目陈述假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。输入格式输入包括两行,第一行是一个整数n,表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai是第i种果子的数目。输出
2021-02-14 10:47:00
300
原创 AcWing907 区间覆盖(区间贪心、双指针算法)
题目:AcWing907 区间覆盖题解目录前言一、题目陈述二、解决思路1.排序2.遍历贪心3.双指针算法三、代码实现总结前言区间贪心问题解法正确的证明方法:为了证明真实解ans=解法求得的解cnt,可以利用两边夹逼的思想(证明ans<=cnt同时证明ans>=cnt),这两个条件前一个靠定义证明,后一个靠构造极限情况或者反证法证明。还有一种证明思路是:证明真实解可以通过等价变换变化到解法算出的解(即所求最值没有发生变化)。一、题目陈述二、解决思路1.排序将区间按照起始端点从小到
2021-02-14 10:35:52
330
原创 AcWing906 区间分组(区间贪心、优先队列)
题目:AcWing906 区间分组题解目录前言一、题目陈述二、解决思路1.区间贪心的整体思路2.如何快速判断一个区间能否加入到已经存在的某一个组三、代码实现总结前言区间贪心问题解法正确的证明方法:为了证明真实解ans=解法求得的解cnt,可以利用两边夹逼的思想(证明ans<=cnt同时证明ans>=cnt),这两个条件前一个靠定义证明,后一个靠构造极限情况证明。一、题目陈述这道题目对应的实际场景可能是,将一群同学分组去旅游,但是其中有一些人有过节,不能分到同一组,所以我们要在考虑这
2021-02-13 10:31:49
269
原创 AcWing908 最大不相交区间数量(区间贪心)
题目:AcWing908 最大不相交区间数量题解目录前言一、题目陈述二、解决思路三、代码实现总结前言贪心问题,为了找到解决方法,我们可以尝试一些可能的贪心方法。而对于区间的贪心,不外乎就是根据区间的起始端点或者是结束端点进行排序后探索做法。这道题目对应的实际场景可能是大学选课时,每节课都有起始时间和终止时间,求在互不冲突的情况下,学生能够选定的课程的最大数量。一、题目陈述二、解决思路这道题和AcWing905 区间选点的表述不同,但是代码和思考方法是一模一样的。三、代码实现#inclu
2021-02-11 10:40:19
366
原创 AcWing905 区间选点(区间贪心)
题目:AcWing905 区间选点题解目录前言一、题目陈述二、解决思路三、代码实现总结前言贪心问题,为了找到解决方法,我们可以尝试一些可能的贪心方法。而对于区间的贪心,不外乎就是根据区间的起始端点或者是结束端点进行排序后探索做法。一、题目陈述二、解决思路这道题中,最少点数对应的方案必然是让每一个点能够覆盖的区间最多,那么就可以考虑将区间按照终点从小到大进行排序,设置一个temp变量存储此时最新的点的坐标位置,变量res存储需要的点的个数。每当temp无法覆盖下一个区间的时候,就将temp设置
2021-02-11 10:09:32
337
原创 Hdu1312 Red and Black(BFS)
题目:Hdu1312 Red and Black题解目录前言一、题目陈述二、解决思路三、代码实现总结前言这道题可以利用简单的BFS搜索解决。一、题目陈述二、解决思路通过BFS搜索所有可能到达的黑色地砖,每当到达一个黑色地砖,就将其状态数组st对应的值置为1表示已经访问过。三、代码实现#include<bits/stdc++.h>using namespace std;const int N = 100;int w,h;int g[N][N];// 此时站的地方 坐
2021-02-10 22:54:47
293
原创 AcWing143 最大异或对(Trie树、异或)
[AcWing143 最大异或对](AcWing143 最大异或对)题解目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库
2021-02-10 21:31:23
325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人