
ACM教程
文章平均质量分 72
学习笔记
ThXe
这个作者很懒,什么都没留下…
展开
-
排名预测系统
排名预测系统原创 2022-11-25 22:20:02 · 689 阅读 · 0 评论 -
Dinic求最大流
Dinic原创 2022-08-24 12:07:23 · 151 阅读 · 0 评论 -
初学者入门算法竞赛
新手指南原创 2022-08-12 11:29:18 · 2714 阅读 · 0 评论 -
算法竞赛——树状数组的应用
树状数组基本应用原创 2022-07-22 12:01:42 · 146 阅读 · 0 评论 -
算法竞赛-前缀和&差分
前缀和&差分一维前缀和问题描述:输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。前缀和是一种重要的预处理,能大大降低查询的时间复杂度。可以简单理解为“数列的前n项的和”用法: O(1)求得一维连续子数组的和状态定义:1.A[i]:原数组下标为i的值A[i]:原数组下标为i的值A[i]:原数组下标为i的值2.B[i]表示A数组1−i子数组的和B[i]表示A数组1-i子数组的和B[i]表示原创 2022-03-21 14:55:24 · 851 阅读 · 0 评论 -
算法竞赛——二分图
二分图无权二分图(unweighted bipartite graph)的最大匹配(maximum matching)和完美匹配(perfect matching),以及用于求解匹配的匈牙利算法(Hungarian Algorithm);不讲带权二分图的最佳匹配。二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 UUU 和VVV ,使得每一条边都分别连接UUU、VVV中的顶点。如果存在这样的划分,则此图为一个二分图。原创 2022-03-20 12:28:30 · 1051 阅读 · 0 评论 -
算法竞赛——拓扑排序
拓扑排序拓扑排序要解决的问题是给一个图的所有节点排序。我们可以拿大学选课的例子来描述这个过程,比如学习大学课程中有:单变量微积分,线性代数,离散数学概述,概率论与统计学概述,语言基础,算法导论,机器学习。当我们想要学习 算法导论 的时候,就必须先学会 离散数学概述 和 概率论与统计学概述,不然在课堂就会听的一脸懵逼。当然还有一个更加前的课程 单变量微积分。这些课程就相当于几个顶点u , 顶点之间的有向边(u,v) 就相当于学习课程的顺序。显然拓扑排序不是那么的麻烦,不然你是如何选出合适的学习顺序。下面原创 2022-03-20 11:52:09 · 281 阅读 · 0 评论 -
算法竞赛——强连通分量
强连通分量强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通。强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连图图的基础上加入一些点和路径,使得当前的图不在强连通,称原来的强连通的部分为强连通分量。DFS生成树DFS生成树是根据DFS搜索顺序构成的一颗生成树,形如(自上而下,自左而右):有向图的 DFS 生成树主要有 4 种边:树边(tree edge):示意图中以黑色边表示,每次搜索找到一个还没有访问过原创 2022-03-20 11:42:19 · 5752 阅读 · 2 评论 -
算法竞赛——差分约束
差分约束什么是差分约束问题?简单来说差分约束给出k个不等式 形如:xi<=xj+c(i!=j,c为常数)xi<=xj+c(i!=j,c为常数)xi<=xj+c(i!=j,c为常数)求出一个可行解x1=a1.....xk=akx1=a1.....xk=akx1=a1.....xk=ak具体的题目:幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的原创 2022-03-19 00:12:01 · 282 阅读 · 0 评论 -
算法竞赛推荐书单
前言入坑算法竞赛已经一年半了,在这期间也读了不少关于算法竞赛的书,这些书对我的帮助还是蛮大的。平时看题解多是个人零散的题解,很难以系统的去学习,认认真真的挑选1-2本书来阅读,无论是从思维能力还是文字表达能力都会得到提升,以下都是我自己读过的书进行一下分享,难度由浅入深,部分书籍浅尝而止。入门:《啊哈!算法》适合:总题量150以下初步掌握C语言的萌新一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松原创 2022-02-23 23:17:58 · 7078 阅读 · 0 评论 -
算法竞赛常用OJ食用指南
前言在准备像ICPC、CCPC、蓝桥杯之类的算法竞赛时,学习完相应的知识点后往往需要大量刷题来巩固,一个OJ的好坏程度我认为可以根据以下几个方面来评定:1.题目的质量2.题解的质量3.比赛的质量除此之外还有如UI设计、在线编译器等等每个OJ都有自己不同的特点,需要我们在有需要的时候使用,下面就为大家详细描述如何利用常见的OJ来帮助自己成长,这篇文章主要面向萌新入门所以会讲的啰嗦一点。洛谷适用于:新手入门、参加蓝桥杯、课程训练等题目点击上方链接,左侧点击题单题单分为两种 官方精选与用户原创 2022-02-21 15:41:17 · 2125 阅读 · 0 评论 -
算法竞赛——数据结构
前言本文介绍算法竞赛涉及到的数据结构。数据结构可以分为数据组织形式与数据操作两个部分,数据结构是为了通过将信息高效存储与管理来解决一些问题而存在的。正文1.栈思想与功能栈主要是提供一种后进先出的思想来帮助我们解决一些问题。算法应用例题1:表达式求值例题2:单调栈2.队列思想与功能队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表算法应用例题1:滑动窗口3.双端队列思想与功能双端队原创 2022-01-16 20:08:45 · 982 阅读 · 0 评论 -
算法竞赛——字符串算法
前言本文对算法竞赛中可能涉及字符串算法做一个功能说明。1.Trie(字典树)算法功能:判断一个字符串在模式串中出现的次数例题1:维护一个字符串集合,支持两种操作:I x 向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。2.KMP算法功能:线性复杂度求匹配串在模式串出现的位置例题1:给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下原创 2022-01-15 18:39:40 · 1226 阅读 · 0 评论 -
算法竞赛——搜索思想进阶
前言搜索常常是用于暴力枚举各种状态的常用手段,本文将简单介绍各类搜索的思想并不做过多展开,作为知识面的增宽,如若需要更多了解请参考百度百科、OI WIKI。深度优先搜索(DFS Depth first search)过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.常常指利用递归函数方便地实现暴力枚举的算法例题1:把正整数 n分解为 3 个不同的正整数,如6=1+2+3 ,排在后面的数必须大于等于前面的数,输出所有方案。例题2:按照字典序输出自然数 1 到 nn原创 2022-01-14 23:17:41 · 782 阅读 · 0 评论 -
算法竞赛入门——常用算法、数据结构功能简介
前言本文主要总结常见算法的功能及模板。不涉及具体实现,可以作为板子备着。原创 2022-01-13 14:26:52 · 1357 阅读 · 1 评论 -
算法竞赛入门-DFS
一道很适合入门DFS的题来帮助大家学习算法:给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数 n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1在初学的时候,若n已知,那么可以写多重循环来得到答案,但是当n变化时候,如果用if语句判断再多重循环会显得十分累赘,但是由于这题数据较小这个原创 2021-03-20 00:05:00 · 234 阅读 · 0 评论 -
算法竞赛入门-归并排序
归并排序图解将一个序列变为升序序列#include<iostream>using namespace std;int tem[100010],num[100010];void sort( int l, int r){ if (l >= r)return;/终止条件 int mid = (l + r) / 2;//每次取中间 sort(l, mid), sort(mid + 1, r);//logn时间复杂度直到只剩不能在分割的单个子区间 in原创 2021-03-23 20:30:45 · 346 阅读 · 0 评论 -
算法竞赛入门-二分
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。输入格式第一行包含整数 n 和 q,表示数组长度和询问个数。第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。接下来 q 行,每行包含一个整数 k,表示一个询问元素。输出格式共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回 -1 -1。数据原创 2021-03-23 21:35:49 · 187 阅读 · 0 评论 -
KMP算法
给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串 P。第三行输入整数 M,表示字符串 S 的长度。第四行输入字符串 S。输出格式共一行,输出所有出现位置的起始下标(下标从 0 开始计数),整数之间用空格隔开。数据范围1≤N≤1051≤M≤106输入样例:3aba5a原创 2021-04-28 23:27:17 · 129 阅读 · 1 评论 -
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 行,原创 2021-05-18 11:09:31 · 167 阅读 · 0 评论 -
算法竞赛入门-dijstra单源最短路算法
原题链接给定一个 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,图中涉及边长均不超过10000。输入样例:原创 2021-05-18 11:21:36 · 280 阅读 · 0 评论 -
算法竞赛入门——递归剪枝
#include<iostream>using namespace std;int n;long long ans;long long dfs(int n){ if (n / 2 < 1)return 0; for (int i = n/2; i>=1;i--) { ans++; dfs(i); } return ans;}int main(){ cin >> n; cout<<dfs(n)+1; retur原创 2021-07-05 01:41:37 · 1010 阅读 · 0 评论 -
容斥定理-能被整除的数
题意:给定一个整数 n 和 m 个不同的质数 p1,p2,…,pm。1≤m≤16,1≤n,pi≤109请你求出 1∼n 中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。能被整除的数题目分析:先考虑朴素做法:1.对于每个1-n每个数试除法判断,复杂度O(nm)一定会超时2.打表枚举p1-pm的倍数,开个布尔数组记录是否存在,再历遍1-n求得个数,bool数组开不到那么大(可恶).接着引入今天的主题-容斥定理用人话说就是,当选取集合交集的个数为奇数时符号为正,选取集合符号为原创 2021-07-20 22:46:49 · 546 阅读 · 0 评论 -
算法竞赛入门Bfs算法——路径记录( penguins)
Lovely penguins is a tiny game in which the player controls two penguins.The game holds in two 20 \times 2020×20 grids (the left one and the right one), and each has some blocked places.We number the grid in x^{th}xthrow (starting from the up), y^{th}原创 2021-09-02 21:39:57 · 637 阅读 · 11 评论 -
算法竞赛入门-01背包问题
前言首先我们来了解一下什么是背包问题,其题目大意是对于一定容量的背包,给出一些物品,解出在容量内所能得到物品价值的最大值。背包问题其实是DP(动态规划)中的一类问题,学习背包问题可以让我们深刻的理解DP算法思想,无论是面试题、算法竞赛,DP都是至关重要的一类算法,今天我来为大家总结常见的01背包思路分析与问题分析。01背包问题有 N 件物品和一个容量是 V 的背包。每件物品只能装入一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值原创 2021-08-29 17:14:58 · 482 阅读 · 3 评论 -
算法竞赛入门教程-输入输出与数据处理进阶学习
输入输出进阶学习在做题的过程,数据读入是第一步,如果卡在这那么任何算法都是无能为力的,正确的将数据放在自己想要的地方也是至关重要的,输出也是同样的道理。下面来讲解在输入输出中会遇到的一些坑点,以及优化细节。stdio.h and iostream在c语言中我们常常用scanf 和printf 来输入输出,在进一步学习c++后cin,cout会出现到我们的视线,那么这两种方案具体有何区别呢?scanf和cin的利弊:scanf:利:耗时短,写法方便输入固定格式,比如scanf("%*d%d",&a原创 2021-12-21 16:23:34 · 407 阅读 · 0 评论 -
算法竞赛入门——优先队列
优先队列百度百科:普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。简单来说优先队列的队头是你所设定优先级最高的元素(最大、最小),这一点其实和排序很像,但是优先队列的特点是动态加数据时算法复杂度只需要O(logn),而如果每次加入一个数重新排序的话需要O(nlogn)的。为了让大家更好的理会这一点,引原创 2021-12-17 23:49:48 · 740 阅读 · 0 评论 -
ACM入门教程-图的存储
图简单来说图就是由一些点与一些边组成,点与点可以通过边连接每条边可以由权值,那么通过题目的输入如何来储存一张图呢?图的存储结构体要解决这个问题,我们首先需要知道需要储存图的那些信息,对于一组数据会给出起点、终点、边长。那么最简单的方法就是用一个结构体数组来存储所有的信息。struct edge{int a,b,w;//起点为a,终点为b,边权为w}e[maxn];int main(){ for(int i=1;i<=edge_num;i++) { int原创 2021-12-14 20:20:38 · 845 阅读 · 0 评论 -
ACM入门-最小生成树及其应用
前置知识邻接矩阵、并查集什么是最小生成树?今天要讲解的算法是最小生成树,那么什么是最小生成树呢?由于是面向新手的算法教程,尽量用大白话来讲清楚最小生成树这个定义。假定有这么一个问题,有6个城市,城市之间有一些道路,修道路需要花费不同的金额,现在要你选择其中一些道路,使得所有城市可以互相到达(联通)且花费最小。这个问题的答案就是最小生成树,我们把这个问题抽象为一张图,每个城市是一个点,城市与城市的道路是一条无向边。如何求解这个问题?Prim算法算法思路:将所有城市分为两个集合,一个集合X是已经原创 2021-12-14 00:12:01 · 1472 阅读 · 0 评论 -
ACM入门教程-枚举
写在前面枚举是最为入门的一种算法,其思想是把所有状态都列举一遍然后寻找想要的答案,这种算法利用了计算机高速计算的特点,也就是我们也常常把枚举称为暴力算法,它的正确性显而易见,后续的其余算法常常是基于暴力枚举上的优化,如:前缀和、二分等。所以掌握枚举的思维对于入门的新手来说是至关重要的。半平面交Problem Description所谓半平面就是一个二元一次不等式,形如:ax+by<c。或者是大于、小于等于、大于等于。给定2个一元二次不等式:ax+by<cdx+ey>f求范围原创 2021-11-12 17:16:05 · 701 阅读 · 0 评论 -
ACM入门教程-素数
写在前面大家最早接触到素数应该是在小学的时候,它的特点就是除了能被1和自己本身整除以外没有其它数可以整除,也就是没有其它约数了。素数也常常用于ACM的题目中,最为基础的就是判断素数,对于判断一个数是不是素数有很多种算法,常见的有试除法、线性筛…这些不同的算法也运用于不同的场景。...原创 2021-11-12 15:08:23 · 763 阅读 · 0 评论 -
ACM入门教程-线性递推
写在前面今天讲一个基本的算法思想递推,所谓递推就是根据当前值能够求出下一个值,比如我们熟悉的斐波那契数列,它规定了前两个数为1,剩下的数由f(n)=f(n-1)+f(n-2)来推导而出,在算法竞赛中,常常抛出一个实际问题,大家需要抽象出数学模型也就是递推式子就能顺利解题目。奇怪的数列Problem Description塔兹米是一个喜欢数学的好孩子。有一天,他发现了一个奇怪的数列:1,1,2,3,5,8,……在思考许久之后,聪明如他也没办法算出数列中第N个数字,你能帮助他吗?Input有多组原创 2021-11-05 16:45:28 · 728 阅读 · 0 评论 -
ACM入门基础-排序
写在前面在入门算法中最为重要的我认为就是排序算法了,将数据排序后将会有许多良好的性质,有序、递增的数据很多时候就是解题的关键,排序算法有很多,常见的有冒泡排序、选择排序、快速排序、归并排序、桶排序…排序算法五花八门,但归根到底的作用就是将无序的数据进行升序或者降序排序,本文通过几道例题来分析各个排序算法的使用场景以及优劣性,但是本文不具体讲述排序算法的实现过程,侧重于对数据的分析从而选择合适的算法。各大排序时间算法复杂度数据量:n 数据范围 :m冒泡、选择排序时间复杂度O(n2)O(n^{2})原创 2021-10-27 17:14:22 · 776 阅读 · 1 评论 -
ACMer入门-标准输入与输出格式
ACMer入门-标准输入与输出格式本文主要帮助刚接触ACM赛制的同学熟悉并理解常见的比赛输入输出格式由于ACM采用逐字符匹配来判断答案的正确性,所以对格式要求十分严格,为避免思路正确却因为格式问题遭到罚时,需要深刻理解比赛时的数据输入输出与处理。知识点1、EOF理解2、while()循环灵活应用以下为所有题目链接例题A+B for Input-Output Practice (I)Problem Description:Your task is to Calculate a + b.To原创 2021-10-22 17:32:35 · 2327 阅读 · 6 评论