ACM学习笔记专栏
文章平均质量分 64
记录ACM比赛所需学习的知识点
迷亭1213
帅帅帅
展开
-
CTU Open Contest 2019补题
本次比赛题目按照通过人数升序依次为:A B F C G J H E I D。测试地址:计蒜客官方数据、题面、题解文章目录A. Beer BarrelsB. Beer BillC. Beer CoastersD. Beer FloodE. Beer GameF. Beer MarathonG. Beer MugsH. Screamers in the StormI. SixpackJ. Bee...原创 2020-02-24 13:17:22 · 801 阅读 · 0 评论 -
二分模板优化&三分
二分搜索之前整理的二分搜索模板在对找x的前驱、后继以及实数域上的二分都有各自不同的代码,其中一些小细节需要我们不断去测试修改最终得以实现不遗漏且保证答案正确性。而现在我们可以将上述几种不同的二分搜索代码整合在一起,对于不同的使用情况只需稍微修改一下“精度”即可。代码模板int low = 0,high = n; while(low <= high){ int mid = (low...原创 2020-02-23 11:54:09 · 354 阅读 · 0 评论 -
背包问题-笔记整理
本文为个人笔记,这算是我第三次系统的学背包问题。根据老师所写课件,所记为个人感悟以及知识点梳理,方便日后复习,如有不足之处请斧正,感谢。1.背景:1.1 什么是背包问题:背包问题指这样一类问题,题意往往可以抽象成:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。(来自百度百科)1.2 背包问题的种类:就ACM或者其它算法竞赛...原创 2019-02-24 16:18:10 · 63594 阅读 · 13 评论 -
Windows 下的对拍程序(ACM等比赛适用)
参考出处:ACM/OI 对拍程序的写法对拍程序思路:生成测试数据 将测试数据分别输入到标称与自己的代码,并获得输出 对比两个输出是否相同一般呢,我们会写个 rand.cpp 来生成测试数据,即每运行一次rand.exe就会生成一组测试数据。接下来呢,假设标称文件是std.exe,而自己写的代码为my.exe,我们需要做的是将rand.exe生成的数据保存到data.in文件中,然...原创 2019-02-15 19:56:59 · 1428 阅读 · 0 评论 -
(环上)最大子段和
1.背景最大连续子段和是一类问题,即求一个序列最大连续子序列的和。问:给出n个元素分别为A1,A2,...,An,求出其最大连续子段和。2.求解思路2.1 动态规划:设A[ i ]为该序列第 i 个元素,C[ i ]存放前 i 个序列的最大子段和,那么C[ i ]有两种可能结果:2.2 问题2:A1,A2,...,An 首尾相连,求出该环上最大子段和。2.3 问题2...原创 2019-02-01 17:37:36 · 1305 阅读 · 0 评论 -
莫比乌斯函数与莫比乌斯反演
以下笔记整理自:《算法设计编程实验》吴永辉1.结论1.1 莫比乌斯函数:莫比乌斯函数可以看做一个辅助函数,它在莫比乌斯反演公式中用到。1.2 莫比乌斯反演:莫比乌斯反演公式是 根据和函数来求算数函数的一个公式。1.3 算数函数:所有在正整数上运算的函数称为算数函数。1.4 和函数:设 f 是算数函数,f 的和函数为。其中d为n的约数,所以 f 的和函数F(n)就是n的所有约数的...原创 2019-01-27 14:20:41 · 804 阅读 · 0 评论 -
子字符串查找之Rabin-Karp算法
1.背景1.1 算法简介:M.O.Rabin和R.A.Karp发明了一种基于散列的字符串查找算法。我们只需要计算模式串的散列函数,然后利用相同的散列函数计算文本中所有可能的M个字符的子字符串散列值并寻找匹配。如果找到了一个散列值和模式字符串相同的子字符串,再继续验证是否相同。这是一个有趣的算法,重点不在于其只用线性时间解决问题,而在于其对散列技术的使用,这是一个具有启发性的算法!1.2 结...原创 2019-01-01 19:13:22 · 998 阅读 · 0 评论 -
Miller_Rabin测试法
简介:Miller_Rabin法是一种简便的素数测试方法,一般用于测试大数是否为素数。Miller_Rabin测试原理:如果n是素数,且与a互质,则 。(1)证明:请参考费马小定理证明方法。思路:依据上述原理,我们可以不断选取与 n 互质的 a ,如果上式(1)都成立的话,那么n可能是一个素数,否则一定不是一个素数。如此一来只要a取得够多,就可以保证结果的准确度。一般在32位内的任一个...原创 2018-12-25 11:32:59 · 887 阅读 · 0 评论 -
二分搜索算法笔记C++
1.背景1.1 结论在有序数组中查找某个值,或者在求最优解问题时,二分搜索非常有用。思想一般是先假定一个解,并判断是否可行,接着缩小解的范围继续判断。1.2 概念二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。在程序设计竞赛中,经常可以见到二分搜索法和其他算法结合的题目。2.二分搜索2.1思想二分答案转化为判定。一个宏观的最优化问题也可以抽象为函数...原创 2018-12-20 15:14:18 · 1081 阅读 · 2 评论 -
博弈论-SG函数笔记
例一:给定n堆物品,第 i 堆物品有 Ai 个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采用最优策略,问先手能否获胜。1.概念1.1 局面:游戏过程中面临的状态称为局面。1.2 先手与后手:整局游戏第一个行动的称为先手,第二个行动称为后手。1.3 最优策略:若在某一局面下存在某种行动,使得行动后对手面临必败局...原创 2018-12-16 12:31:34 · 514 阅读 · 0 评论 -
矩阵快速幂模板C++
思路:和整数快速幂一样,唯一不同的就是存放结果的矩阵初始值为单位矩阵,通过重载运算符*后,代码可以大大简化。另外需要注意的是取模问题,我把模M放在了全局变量,这样省却一些麻烦,可以根据自身需要调整,这个无伤大雅。代码示例:#include<iostream> #include<cstdio> #include<cstring> using ...原创 2018-12-04 21:41:52 · 7442 阅读 · 0 评论 -
异或空间与高斯消元
1.异或空间相关概念1.1 异或空间:依据线性空间的概念,我们可以进一步推广,不限于向量、向量加法和标量乘法。“异或空间”也是一个很常见的形式。异或空间是一个关于异或运算封闭的非负整数集合。可以在异或空间中用类似方法定义“表出” “线性无关” “基底” 等概念。(注:线性空间又称向量空间,是线性代数中的重要概念,用来处理代数运算以及其它更抽象的问题。)1.2 表出:若整数b能由整数 a1,...原创 2018-11-29 12:00:07 · 9322 阅读 · 0 评论 -
Manacher算法笔记 C++
Manacher算法简介:1.作用:Manacher算法又名马拉车算法,用来求一个字符串中最长回文子串的长度。2.复杂度分析:时间复杂度为O(n)。算法核心思想:1.伪代码:假设str为待判断的字符串,len[ i ]数组存放以该 str[ i ] 字符为中心的最长回文子串的长度,mid为当前最长回文子串的中点,mx为当前最长回文子串的右边界,那么对当前位置 i 有如下伪代码:(此...原创 2018-11-16 19:03:55 · 10073 阅读 · 0 评论 -
矩阵乘法模板C/C++
由于矩阵相乘是诸多算法中的基础,就像乘法之于快速幂一样,所以有必要熟练掌握,以下模板是我个人觉得用起来比较方便的,但是随着时间迁移肯定是需要对其进行精进的。代码示例:struct Matrix{ int n,m; int v[maxn][maxn]; Matrix(int n,int m):n(n),m(m){} void init(){ //初始化矩阵 memse...原创 2018-11-12 12:34:34 · 14202 阅读 · 2 评论 -
Baby Step,Giant Step算法模板
介绍:BSGS(Baby Step,Giant Step)算法是用来求高次同余方程的解的算法。模板:P148//baby step giant step#include<iostream>#include<map>#include<cmath>using namespace std;typedef long long ll;ll q_pow...原创 2018-11-11 15:48:37 · 8840 阅读 · 0 评论 -
拓展欧几里得算法模板
代码示例:求出ax + by = c的所有解#include<cstdio>int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1,y = 0; return a; } int d = exgcd(b,a%b,x,y); int t = x; x = y,y = t - a/b*y; r...原创 2018-11-04 21:19:44 · 8730 阅读 · 0 评论 -
欧拉函数与线性筛模板
代码实例:求单个欧拉函数。分解单个数,可以用循环来实现,不必借助辅助数组。线性筛求欧拉函数://求欧拉函数phi #include<cstdio>int phi(int n){ int ans = n; for(int i = 2;i*i <= n;i++){ if(n%i == 0) ans = ans/i*(i-1); while(n%i == 0)...原创 2018-10-30 15:53:47 · 8854 阅读 · 0 评论 -
KMP算法--Next数组详解与优化
本篇文章直接跳过蛮力算法以及一些简单背景,着重讨论Next数组的意义以及其是如何工作的,并对如何求Next数组做详细记录。1.背景1.1 KMP算法的应用:KMP算法用来解决模式串匹配问题。1.2 为什么要用KMP算法:普通的蛮力算法时间复杂度为O(n*m),而KMP为O(n+m)。2.KMP算法思想2.1 KMP算法的思想:(称T为目标串,P为待查找字串)目标串T的 ...原创 2018-10-15 17:15:15 · 13973 阅读 · 2 评论 -
kd-树笔记
以下内容均为本人近几天学习笔记,个人理解,并非完美答案,请抱着怀疑眼光阅读,如有错误请告知,感谢!1.kd-树简介1.1 特征:在任何情况下,kd-树都是一棵递归定义的平衡二叉搜索树1.2 用途:常用于范围查询,高效解决多维范围查询。例如:快速在校友数据库中找到1970-2000年毕业并且身高在170-190cm且性别为男的校友。2.kd-树的实现2.1 一维kd-树:一维...原创 2018-10-05 19:42:48 · 8887 阅读 · 0 评论 -
逆元inv详细整理
个人笔记,仅供复习1.概念1.1 定义:逆元素是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元和乘法中的倒数。1.2 数论中定义:如果满足公式,a*b = 1(mod P),则a是b的逆元,同时b也是a的逆元。1.3 另一种定义:a*x = 1 (mod P),其中a与P互质,则称x的最小整数为a关于P的逆元。2.逆元的应用2.1 除法...原创 2018-09-23 21:36:21 · 11122 阅读 · 1 评论 -
AVL树的调整(笔记)
1.定义二叉树:二叉树是每个结点最多有两个子树的树结构。 二叉搜索树:二叉搜索树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。平衡二叉搜索树:平衡二叉搜索树(Self-balanc...原创 2018-09-06 20:22:19 · 9699 阅读 · 0 评论 -
Bellman-Ford与SPFA判定负环
1.Bellmen-Ford判定负环思路:若经过n轮迭代,算法仍未结束(仍有能产生更新的边),则图中存在负环 若n - 1轮迭代之内,算法结束(所有边满足三角不等式),则图中无负环2.SPFA判定负环思路:设cnt[x]表示从1到x的最短路径包含的边数,cnt[1] = 0。当执行更新dist[y] = dist[x] + z 时,同样更新cnt[y] = cnt[x] + 1...原创 2018-08-27 09:15:31 · 9316 阅读 · 1 评论 -
Dijkstra算法模板 C++
代码出自:《算法竞赛入门经典——训练指南》P328#include<iostream>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn = 10005;const int INF = 2147483647;struc...原创 2018-08-24 15:04:45 · 12697 阅读 · 1 评论 -
最长上升子序列(LIS)及其优化O(nlongn)
按照数据结构来划分的话,最长上升子序列(LIS)是属于线性DP,其作为动态规划经典入门模型,重要性也是不言而喻的。而LIS问题也有很多种变型,对于这些问题有的超过了动态规划的适用范围,有的需要对转移方程进行更改,需要具体问题具体分析。前置知识: - 子序列的概念 - 动态规划一般步骤 - 二分查找问题模型:给定一个长度为N的数列A,求数值单调递增的子序列长度最长是多...原创 2018-08-21 10:32:14 · 8263 阅读 · 0 评论 -
计算拓扑排序的两种方法
个人笔记,仅供复习 ——《数据结构编程实验》P351计算拓扑排序的方法有两种:删边法和采用DFS计算拓扑排序。1.删边法:由于每一条拓扑子路径的首节点的入度为0,因此可以采取如下办法:步骤1:从图中选择一个入度为0的点且输出之 步骤2:从图中删除该节点及其所有出边(即与之相邻的所有点入度-1)反复执行这两个步骤,直至所有节点都输出,即整个拓扑排序完成;或者直至剩下的图中再没有入...原创 2018-08-16 22:15:05 · 12602 阅读 · 0 评论 -
递推式计算与矩阵乘法 C++
以斐波那契数列为例,计算斐波那契数列的矩阵方法代码如下:(快速幂、矩阵乘法)《挑战程序设计竞赛第二版》P199#include<iostream>#include<vector>using namespace std;typedef vector<int> vec;typedef vector<vec> mat;int M = 1...原创 2018-07-29 20:22:32 · 533 阅读 · 0 评论 -
Floyd算法 笔记 C/C++
个人笔记,仅供复习1.适用范围:求每一对顶点之前的最短路径(适用稠密图)2.算法思想:在一般情况下,若(vi,…,vk )和( vk,…,vj )分别是从 vi 到 vk 和从 vk 到 vj 的 中间顶点的序号不大于k的最短路径,则将( vi,…, vk ,… , vj )和已经得到的从vi到vj且中间顶点的序号不大于k-1的最短路径相比较,其长度较短者便是从vi到vj的中间顶点的序号不大于k的...原创 2018-07-15 10:53:18 · 917 阅读 · 1 评论 -
Bellman-Ford 与 SPFA 算法笔记
个人笔记,仅供复习1.Bellman-Ford算法1.1 适用范围:含负权边的带权有向图的单源最短路问题。不能处理带负权边的无向图1.2 限制条件:要求图中不能包含权值总和为负值回路(负权值回路),如下图所示:1.3 算法思想:1.3.1 构造dist[k][u]:算法构造了一个最短路径长度序列dist[k][u]。其中:dist[1][u]是从源点v到终点u的只经过一条边的最短路径长度,并有di...原创 2018-07-15 10:29:00 · 2537 阅读 · 2 评论 -
Dijkstra算法 C++
个人笔记,仅供复习,整理自陈越老师的网课1.适用范围:解决无负权边的带权有向图或无向图的单源最短路问题2.算法思想:贪心思想,每次从当前结点出发走下一个权值最小的边。3.伪代码:令S={源点s + 已经确定了最短路径的顶点vi}对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点。即路径{s->(vi属于S)->v}的最小长度若路径是按照递增(非递减...原创 2018-07-15 09:19:43 · 547 阅读 · 0 评论 -
C/C++ 子集生成算法整理
个人笔记,仅供复习1.概念:给定一个集合,枚举所有可能的子集。2.常用算法增量构造法位向量法二进制法3.增量构造法3.1 思路:一次选出一个元素放到集合中。3.2 代码实例:void print_subset(int n,int *A,int cur){ for(int i = 0;i < cur;i++) cout << A[i] << " ";//打印当前子集 ...原创 2018-07-03 13:56:25 · 7939 阅读 · 0 评论 -
C++ 求枚举排列的两种方法
枚举排列常用的方法有两种:一是递归枚举,二是用STL中的next_permutation。1.枚举递归:2.next_permutation: 头文件:#include<algorithm> 原型:bool next_permutation(iterator begin,iterator end);已排好序的数组每次调用在原数组进行下一次排列如果当前序列不存在下一个排列时,...原创 2018-07-02 22:56:33 · 17510 阅读 · 0 评论 -
C++ 快速幂运算
1.概念:快速幂运算也叫反复平方法。顾名思义,算法就蕴含在名字中。2.原理: 假设要求x^n,如果n = 2^k,那么原题可以很轻松的表示为:x^n = ((x^2)^2)^2…。这样只要做k次平方运算就能解决,时间复杂度就从O(n)下降到log(n)。 由上面的分析可知,只要幂运算的幂可以写成2^k的形式,就可以用上面的方法降低时间复杂度。所以我们可以将任意的实数n改写有限个2^k的...原创 2018-06-05 20:21:14 · 37595 阅读 · 4 评论 -
C++尺取法
1.概念:所谓尺取法,顾名思义,就是像一把尺子(固定某一条件),不断向右(左)移动,不断更新所求答案。一般用来求满足条件的最小区间。2.实现步骤:初始化左右端点不断扩大右端点,直至满足条件如果直至终点也无法满足条件,则终止,否则更新结果扩大左端点(右移1),跳回步骤23.伪代码:4.例题:给定一个整数S,求一个长度为n的序列(所有元素均为正整数)中总和不小于S的连续子序列的长度的最小值,如果不存在...原创 2018-05-15 20:21:21 · 6857 阅读 · 0 评论 -
C/C++高精度运算(大整数运算)详解(含压位)
1.高精度加法1.1 高精度加法高精度运算的基本运算就是加和减。和算数的加减规则一样,模拟竖式计算,考虑错位运算与进位处理。下面是我老师给的代码,目前比网上其他的代码要精简和巧妙。#include <cstdio>#include <cstring>int main(){ char a[202]={0}, b[202]={0...原创 2018-04-22 22:49:50 · 25818 阅读 · 13 评论 -
C/C++快速排序及优化详解
一、快速排序原理快速排序是一种基于分治思想的排序算法。在快排中,我们的工作主要集中在划分而不是合并子问题。首先我们要选择一个中轴,把比中轴大的元素放在它的右边,比他小的放在它的左边。中轴的选择有很多种,其中最简单的就是把第一个元素当作中轴。二、从两端同时扫描交换 首先选择子数组的第一个元素为中轴,即P = A[s]。分别从子数组的两端进行扫描,并且将扫描到的元素与中轴进行比较。从左到右的扫描...原创 2018-04-14 12:20:54 · 26101 阅读 · 1 评论 -
杨氏矩阵( Young Tableau )与勾长公式
1.背景1.1 简介:从ACMer角度来讲,杨氏矩阵并非无可替代,事实上我们也似乎并不需要其种种神奇的特性,但是作为一种算法与数据结构,我们还是需要了解的,好在其难度并不太大。1.2 2.定义2.1 杨氏矩阵:杨氏矩阵(杨氏图表)是一个矩阵,它的每一个元素满足下面两个条件:如果位置(i,j)没有元素,则它的右边和上边相邻位置一定也没有元素 如果位置(i,j)有元素a[ i ]...原创 2019-02-05 16:26:01 · 2277 阅读 · 0 评论 -
可持久化线段树(主席树)
摘要主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。可持久化数据结构可持久数据结构...原创 2019-08-29 20:23:12 · 3406 阅读 · 0 评论 -
拓展欧拉定理+幂塔函数
拓展欧拉定理与幂塔函数欧拉定理: 若gcd(a,p) = 1,则 ap≡ab%φ(p)(mod p)a^p \equiv a^{b \% \varphi (p)}(mod \: p)ap≡ab%φ(p)(modp),其中gcd(a,p) = 1。拓展欧拉定理: 假设a为任意数,b和m为正整数,且b>φ(m)b > \varphi(m)...原创 2019-09-02 12:16:28 · 1725 阅读 · 0 评论