奇怪的OI/ACM知识合集
文章平均质量分 61
qaq
Ice_teapoy
emmmmmmm,退役OIer...萌新ACMer...不定时更新...
展开
-
基础-高精度计算
高精度1 定义由于C语言的数据类型能存放的数字大小有一定的限制。如整型int表达范围是(−231-2^{31}−231~231−12^{31}-1231−1)无符号整数unsigned long是(0~ 232−12^{32}-1232−1)浮点型double只能提供15~16位的有效数字。因此,在计算位数超过十几位的数时,不能采用现有的数据类型,只能自己编程计算。高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百原创 2021-02-14 14:44:11 · 467 阅读 · 0 评论 -
图论-单源最短路径SPFA
给出一个有向图,请输出从某一点出发到所有点的最短路径长度。原创 2017-11-29 21:11:19 · 671 阅读 · 0 评论 -
基础-深度优先搜索(DFS)
1 深度优先搜索(DFS)1.1 定义先说什么是搜索。搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。在忽略效率的情况下,没有什么是搜索解决不了的(?深度优先搜索(DFS)是基于递归的搜索。想象你在走迷宫:1、 这个方向有路可走,我没走过2、 往这个方向前进3、 是死胡同(到达了已经走过的地方),往回走,回到上一个路口4、 重复第一步,直到找着出口通过这种方式,只要地点的数量是有限的,你就一定可以在有限的时间找到迷宫的出口(或者确原创 2021-02-19 04:20:41 · 2150 阅读 · 0 评论 -
基础-递归
递归1 定义程序调用自身的编程技巧称为递归。递归的实质是将问题转化为规模更小的相同问题。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。它的思想类似于下面这个分段函数(斐波那契数列的第x项):2 构成递归需具备的条件子问题须与原始问题为同样的事,且更为简单;不能无限制地调用本身,必须有个出口,转变为非递归状况处理。3 例题3.1 斐波那契数列题目:无穷数列1,1,2,3,5,8,13,21,34,55…称为Fib原创 2021-02-19 03:39:24 · 282 阅读 · 0 评论 -
其他-OJ常见评测状态说明
0、评测结果有的oj会对每个测试点都给你测试结果说明,有的oj会结合所有测试点给你反馈。1、排队等待中(Pending/Waiting)评测机正在评测其他代码。2、编译中(Compiling)你的代码正在被编译。3、运行评测中(Running/Judging)4、答案正确(Accepted,AC)答案正确,你通过了该测试点。5、编译错误(Compile Error,CE)代码没有通过编译,你的代码有语法问题。6、答案错误(Wrong Answer,WA)你的代码没有TLE(超时)没有原创 2021-02-19 05:11:58 · 1464 阅读 · 0 评论 -
基础-递推
1 递推1.1 定义一种重要的数学方法。即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。相信大家都了解过数列的递推公式,那么递推算法即利用计算机善于快速进行重复性计算的特长,避免求通项公式的麻烦,将一个复杂问题的求解分解成若干个子问题进行求解。1.2 例题与排序算法不同,递推是一种思想,它的代码难度基本没有,难点在于找出递推式。所以我们直接上例题。1.2.1 斐波那契数列题目:斐波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一原创 2021-02-14 14:29:06 · 468 阅读 · 1 评论 -
数据结构-非旋TREAP
Treap=Tree+Heap原创 2018-01-03 16:53:28 · 712 阅读 · 3 评论 -
数据结构-树状数组
功能维护一个数据结构,对一列n个数,实现下面两种操作:将某一个数加上 x求出下标从x到y所有数的和思路定义lowbit(i)lowbit(i)lowbit(i)表示将i转化为二进制后最低位的1所对应的值。比如12的二进制表示为(1100)2{(1100)}_2(1100)2,则lowbit(12)=lowbit((1100)2)=(100)2=4lowbit(12)=lowbit({(1100)}_2)={(100)}_2=4lowbit(12)=lowbit((1100)2)=(100)原创 2021-08-23 01:08:10 · 201 阅读 · 0 评论 -
数据结构-并查集
定义并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规...原创 2019-10-09 21:24:37 · 180 阅读 · 0 评论 -
其他-时空复杂度分析
1 时空复杂度分析1.1 为什么要分析时空复杂度?算法的时空复杂度越低,其效率就越高。算法复杂度是衡量程序优劣及效率的重要指标。对于ACMer来说,我们面对的问题是完成可以在时空限制要求内对给定输出返回正确输出的代码,所以我们必须要结合数据范围对算法进行时空复杂度分析。1.2 时间复杂度(比较重要)1.2.1 时间频度一个算法执行所耗费的时间不仅仅与代码有关,必须上机运行测试才能知道。但我们可以对代码运行的时间进行粗略分析。一个算法花费的时间与算法中语句的执行次数成正相关。一般来说,哪个算法原创 2021-01-13 13:10:21 · 235 阅读 · 0 评论 -
其他-取地址解引用
搞事搞事 取地址解引用什么的QWQ //新操作QWQ#include #include using namespace std;int main(){int a;scanf("%d",&a);printf("%d",*&a);}原创 2018-01-07 11:57:38 · 673 阅读 · 0 评论 -
其他-读入优化与输出优化
朴素读入优化与输出优化【a+b问题】:读入两个数,输出两数之和。/* Coded by Ice_teapoy*/#include <cstdio>#include <cctype>//读入优化int read(){ int res=0,f=1; char x=getchar(); for (;!isdigit(x);x=getcha...原创 2018-12-02 16:26:04 · 484 阅读 · 0 评论 -
基础-递推、贪心、搜索、动态规划对比
每个阶段只有一个状态->递推;每个阶段的最优状态都是由上一个阶段的最优状态得到的->贪心;每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索;每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划。转自@巴比伦的狮子...转载 2021-02-19 04:24:11 · 237 阅读 · 0 评论 -
排序-对比分析
1 冒泡排序1.1 流程从第1个元素至第n-1个元素,每个元素与其下一个元素进行比较。如果当前元素比下一个元素大,就交换他们两个。1过程结束后,数组中最后一个元素将会是所有数字中最大的数字,它处于合适的位置。重复若干次1过程,我们就能找到数组中第2大的元素、第3大的元素、第4大的元素……直至找到第n-1大的元素。数组变为有序数组。1.2 演示编号a[]操作0.第一轮9 3 5 4 1比较第1和第2个元素,不交换。1.第一轮3 9 5 4 1比较第2原创 2021-01-14 20:14:14 · 326 阅读 · 0 评论 -
排序-猴子排序
无限猴子定理最早是由埃米尔·博雷尔在1909年出版的一本谈概率的书籍中提到的,此书中介绍了“打字的猴子”的概念。无限猴子定理是概率论中的柯尔莫哥洛夫的零一律的其中一个命题的例子。大概意思是,如果让一只猴子在打字机上随机地进行按键,如果一直不停的这样按下去,只要时间达到无穷时,这只猴子就几乎必然可以打出任何给定的文字,甚至是莎士比亚的全套著作也可以打出来。猴子排序是基于无限猴子定理形成的算法(x流程随机生成待排序列的一个排列,检测该排列是否是递增序列。重复此过程,直至完成排序。时间复杂度分析平原创 2021-08-19 20:49:29 · 1777 阅读 · 0 评论 -
排序-基数排序
#include <stdio.h>#include <math.h>#include <string.h> #define N 1000001int n,a[N],maxx,len,b[10],t[10],nxt[N],y[N],tot;int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) if (scanf("%d",&a[i]),a[i]>maxx) maxx=a[i];原创 2021-01-14 20:20:58 · 120 阅读 · 0 评论 -
排序-桶排序
#include <stdio.h>#define N 1000001int n,a[N]={0},x;int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&x),a[x]++; for (int i=0;i<N;++i) for (int j=1;j<=a[i];++j) printf("%d ",i); return 0; }原创 2021-01-13 18:29:02 · 124 阅读 · 0 评论 -
排序-快速排序
#include <stdio.h>#define N 100001int n,a[N];void paixu(int l,int r){ if (l>=r) return; int i,j; for (i=l,j=r;i<j;) { while (i<j&&a[j]>a[l]) j--; if (i>=j) break; while (i<j&&a[i]<=a[l]) i++; if (i原创 2021-01-14 20:21:54 · 167 阅读 · 0 评论 -
排序-归并排序
#include <stdio.h>#define N 1001int n,a[N],x,b[N];void paixu(int l,int r){ if (l==r) return; int mid=(l+r)/2+1,i,j,t=0; paixu(l,mid-1); paixu(mid,r); for (i=l,j=mid;i<mid&&j<=r;) if (a[i]<a[j]) b[++t]=a[i++]; else b[++t]原创 2021-01-14 20:19:05 · 286 阅读 · 2 评论 -
排序-希尔排序
#include <stdio.h>#define N 100001int n,a[N];int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]); for (int t=n/3+1;t!=1;t=t/3+1) { for (int i=t+1,j;i<=n;++i) { int x=a[i]; for (j=i-t;j>=1;j-=t)原创 2021-01-13 18:29:59 · 160 阅读 · 0 评论 -
排序-插入排序
#include <stdio.h>#define N 1001int n,a[N],x;int main(){ scanf("%d",&n); for (int j,i=1;i<=n;++i) { scanf("%d",&x); for (j=i-1;j>=1;j--) if (x<a[j]) a[j+1]=a[j]; else break; a[j+1]=x; } for (int i=1;i<=n;++i)原创 2021-01-13 13:37:48 · 108 阅读 · 0 评论 -
排序-选择排序
#include <stdio.h>#define N 1001int n,a[N];int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]); for (int i=n;i>1;i--) { int t,maxi=1; for (int j=2;j<=i;++j) if (a[maxi]<a[j]) maxi=j; t=a[maxi],a[原创 2021-01-14 20:17:34 · 123 阅读 · 0 评论 -
排序-冒泡排序
输入n个数,排序后输出。#include <stdio.h>#define N 101int n,a[N],t;int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]); for (int i=n;i>1;--i) //每一轮将a[]中第i大的元素放在合理位置上 for (int j=1;j<i;++j) // 每个元素与其下一个元素进行比较。如果当前元素比下原创 2021-01-13 13:18:18 · 245 阅读 · 0 评论 -
数论-原根
原根与阶定义设 a,m 两数互质,满足 ax≡1(mod m) 的最小的 x,称为 a 对 m 的阶,记为 ordm(a)。当 ordm(a)=ϕ(m) 时称为 a 为 m 的一个原根。性质1.ax≡1⇔ordm(a)∣xa^x≡1⇔ord_m(a)∣xax≡1⇔ordm(a)∣x2. ordm(a)∣ϕ(m)ord_m(a)∣ϕ(m)ordm(a)∣ϕ(m)3. n有原根⇔n∈...原创 2019-03-09 16:34:54 · 1308 阅读 · 0 评论 -
数论-欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个正整数的最大公约数。计算公式gcd(a,b)=gcd(b,a%b)#include &lt;cstdio&gt;int gcd(int a,int b){ return b?gcd(b,a%b):a;}int a,b;int main(){ scanf("%d%d",&amp;a,&amp;b); printf("原创 2018-12-02 16:45:34 · 366 阅读 · 0 评论 -
数论-生成函数
背景请鱼块地跳过此项。生成函数即母函数,是组合数学中尤其是计数方面的一个重要理论和工具。生成函数有普通型生成函数和指数型生成函数两种,其中普通型用的比较多。形式上说,普通型生成函数用于解决多重集的组合问题,而指数型母函数用于解决多重集的排列问题。最早提出母函数的人是法国数学家LaplaceP.S.在其1812年出版的《概率的分析理论》中明确提出“生成函数的计算”,书中对生成函数思想奠基人—...原创 2019-03-20 11:10:45 · 1251 阅读 · 0 评论 -
数论-扩展欧几里得
扩展欧几里德算法是用来在已知求解一组,使它们满足贝祖等式:ax+by=gcd(a,b)=d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。根据普通欧几里得算法,gcd(a,b)=gcd(b,a%b)若已经求出了另一组数x2,y2,它们满足bx2+(a%b)y2=gcd(b,a%b)③,结合②③,一定有bx2+(a%b)y2=gcd(b,a%b)=gcd(a,...原创 2019-03-09 17:09:53 · 305 阅读 · 0 评论 -
数论-约数和公式
约数定义约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在大学之前,"约数"一词所指的一般只限于正约数。约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。一个整数的约数是有限的。一些性质任何正整数都是0的约数。一个数的约数必然包括1及其本身。一些公式设一个整数A=p1e1∗p...原创 2019-03-09 17:34:12 · 4966 阅读 · 1 评论 -
图论-最小生成树kruskal
假设给定一个加权连通图G,G的边集合为E,顶点个数为n,要求其一棵最小生成树T。假设T中的边和顶点均涂成红色,其余边为白色。开始时G中的边均为白色。1)将所有顶点涂成红色;2)在白色边中,挑选一条权最小的边,使其与红色边不形成圈,将该白色边涂红;3)重复2)直到有n-1条红色边,这n-1条红色边便构成最小生成树T的边集合。#include &lt;iostream&gt;#includ...原创 2019-03-01 16:05:14 · 282 阅读 · 0 评论 -
图论-最小生成树Boruvka
Boruvka算法,算法思想为是贪心,类似于Kruskal。最开始状态是每个点是一个单独的连通块。遍历所有的点和边,找到每一个连通块和其他连通块相连的最小的一条边,然后把连通块合并起来,重复以上操作,直到只剩下一个连通块。每次都会合并两个连通块,整个程序进行log次操作就会完成,每次操作的复杂度为n+m,复杂度是O((n+m)logn)。https://www.luogu.org/prob...原创 2019-03-01 16:01:49 · 724 阅读 · 0 评论