Algorithm
文章平均质量分 70
这个栏目主要记录和分享各种编程题目的解题思路和实现方法,包括经典算法问题、以及编程竞赛中的挑战题目。
门豪杰
怀着真诚与敬畏与世界相处
展开
-
费马小定理和欧拉定理及其证明
费马小定理: 若p是素数, a是正整数且不能被p整除, 则 ap−1=1(modp)ap−1=1(modp){ a }^{ p-1 }\quad =\quad 1(mod\quad p) 费马小定理的扩展: ap=a(modp)ap=a(modp){ a }^{ p }\quad =\quad a(mod\quad p)证明:首先, 给定一个小于p的正整数的集合x{1,....原创 2018-05-10 17:33:05 · 4565 阅读 · 0 评论 -
五分钟看懂二分搜索
二分就是其实就是不断二分查找答案的过程,将二分的区间分成两部分,一部分为满足条件的,一步分为不满足条件的。对于答案是整数类型的 比如求满足x>=k的最小的x那么就要选l,求满足x>k的最小的x就要选r。其中r-1=l。 对于求满足x<=k的最大的x那么就要选r,求满足xvoid solve(){ int l=左边界减一点,r=右边界加一点; ...原创 2016-09-09 10:51:28 · 286 阅读 · 0 评论 -
4种最短路算法的实现
首先是邻接表形式的Bellman_Ford算法,他的复杂度是O(|E||V|),他的优势在于可以计算有负边存在的情况struct edge{int from,to,cost;};int r,n;//r代表边的数量,n代表点的数量edge E[maxr];int d[maxn];void Bellman_ford(int s){ fill(d,d+n,INF); ...原创 2016-09-09 11:10:52 · 418 阅读 · 0 评论 -
kruskal算法和prim算法的实现(最小/大生成树)
最小生成树有kruskal算法和prim算法,前者通过并查集判断是否有环,最后生成一棵树或者是森林。 他的复杂度是O(|E|*log|V|)可以说也是相当低了struct edge{int x,y,val;}E[maxn];int n,r;int fa[maxn],deep[maxn];bool cmp(edge a,edge b){ return a.val<...原创 2016-09-09 11:29:36 · 691 阅读 · 0 评论 -
数位DP的实现
首先是艾庆兴老师总结的数位DP的模板,我觉的这个模板的效率很高而且将题目中的一些条件简化为只需要增加dp数组的维数就可以解决,确实是方便不少#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <algorithm>#define mod 13//这里这个mod的取值就要看题了,如果是原创 2016-08-11 17:10:57 · 375 阅读 · 0 评论 -
kuangbin高精度实现
#include<stdio.h>#include<string>#include<string.h>#include<iostream>using namespace std;//compare比较函数:相等返回0,大于返回1,小于返回-1int compare(string str1,string str2){ if(str1.length()>str2.length())原创 2016-08-24 13:59:39 · 557 阅读 · 0 评论 -
大数a^b%c(快速幂运算)模板
其主要利用的原理就是 a^4 % c=(a^2)^2 % c; 那么这样去快速地算明显是指数级别的计算速度#include<iostream>using namespace std;int main(){ int a,b,c; while (scanf("%d%d%d",&a,&b,&c)!=EOF&&a!=0...原创 2016-08-22 21:22:30 · 3605 阅读 · 0 评论 -
各排序算法的实现及性能比较
#include <cstdio>#include <cstring>#include <ctime>#include <iostream>using namespace std;const int maxn=100+5;void Display(int a[]){ cout << "排序过后的数组为:" << endl; for(int i=0;i<maxn;i++)原创 2016-11-27 19:12:23 · 375 阅读 · 0 评论 -
DFS的通用结构
通用的dfs的模板我认为是很难概括的,不同的问题有不同的处理细节,但是他们都可以借鉴一下的模板伪代码来解决这一类问题bool can(type new){ 判断下有没有超边界或者是不满足题中的条件之类的问题;}void dfs(int now){ if(超出范围){ 执行剪枝; return...原创 2016-08-11 14:53:01 · 610 阅读 · 0 评论 -
线段树的实现
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int tree_maxsize = (1<<18) + 1;//代表最多的二叉树的节点const int maxn = 100...原创 2017-02-19 20:41:13 · 373 阅读 · 0 评论 -
ACM中常用的STL函数及操作
Vector部分#include <cstdio>#include <iostream>#include <queue>#include <algorithm>using namespace std;int main(){ vector<int> a; //向vector的末尾添加元素...原创 2016-08-21 19:48:33 · 1198 阅读 · 0 评论 -
排列组合与集合的实现
本文借鉴于《挑战程序设计竞赛》第二版P156到P157页的内容自己实现,首先我们应该知道的是常用集合运算的位运算: (1) 空集:0; (2) 只含有第i个元素的集合:1<#include <cstdio>#include <iostream>using namespace std;int used[10000];int main(){ int n; cin >>原创 2017-02-02 21:37:20 · 1023 阅读 · 0 评论 -
求逆元的三种方法
逆元是什么?方法一: 最简便的方法方法二: 费马小定理方法三: 扩展欧几里得逆元是什么?每个数a均有唯一的一个与之对应的乘法逆元x,使得(a * x)%m = 1 一个数有逆元的充分必要条件是gcd(a,m)=1,此时逆元唯一存在 逆元的含义:模m意义下,1个数a如果有逆元x,那么对于一个数k有k/a=k*x方法一: 最简便的方法最简便的一种方法是...原创 2016-09-18 19:44:11 · 7378 阅读 · 0 评论 -
BFS的通用结构
首先是一个BFS的模板。BFS通过保证到每一个点的路都是最短的来保证到最后的终点也是最短的。如何实现这种保证,那就是通过队列,比如要到达一个需要走三步才能到达的点E,那么先将一步就能到达的A点与B点入队列,从A点进入队列后会得到一个需要两步才能到达的C点,然后A结束后,执行B会得到一个同样需要两步才能得到的D点,现在队列里又剩下了C,D,先对C进行遍历(他不能再回去)发现它可以到E,那么E就是最短...原创 2016-08-11 15:55:57 · 917 阅读 · 0 评论 -
树状数组的实现
int bit[maxn];//别忘了初始化为0//在bit数组中需要加上x的地方加上x,使得用sum函数查询的时候显示出[i~maxn)区间内所有的元素都加上xvoid add(int i,int x){ while(i<=n){ bit[i]+=x; i += (i & -i); }}//利用bit数组的特性求[1~i]这些...原创 2016-08-11 21:26:18 · 273 阅读 · 0 评论 -
矩阵快速幂的实现
//#include <algorithm>#include <iostream>#include <utility>#include <sstream>#include <cstring>#include <cstdio>#include <vector>#include <queu原创 2016-09-06 19:02:51 · 236 阅读 · 0 评论 -
离散化思想
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如: 原数据:1,999,100000,15;处理后:1,3,4,2; 原数据:{100,200},{20,50000},{1,400}; 处理后:{3,4},{2,6},{1,5};#include <iostream>#include <原创 2017-02-21 16:04:37 · 364 阅读 · 0 评论 -
并查集的实现
并查集的思想就是把一个个有着相同性质或者被执行相同操作的区域当成一个集合来对待,集合与集合之间的区别就在于他们的祖先不一样。我们将一个元素抽象为一个人, 一个集合抽象为一个家族开始时, 每个人的父亲和祖先都是自己, 但是在后面, 他们会认其他人为父亲如何判断两个元素A和B是否在同一个家族中? 只要A的祖先和B的祖先在同一个集合中即可什么是祖先? 如果儿子找父亲, 父亲找爷爷, 爷爷...原创 2016-08-11 19:34:40 · 375 阅读 · 0 评论 -
三分钟理解辗转相除法
今天下午偶然看到辗转相除法, 以前不能够理解原理, 现在能够想明白了. 比如求gcd(1970, 1066)#include <iostream>#include <string>using namespace std;int gcd(int a,int b){ printf("%d = %d * %d + %d\n",a,a/b,b,a%b); ...原创 2018-05-23 18:09:43 · 4593 阅读 · 1 评论 -
Sort the Array
原题链接 B. Sort the Array time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Being a programmer, you like arrays a lot. For your birthday, your原创 2016-08-03 08:15:32 · 331 阅读 · 0 评论 -
DZY Loves Modification(优先队列)
原题链接 B. DZY Loves Modification time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output As we know, DZY loves playing games. One day DZY decided t原创 2016-08-03 08:08:41 · 508 阅读 · 0 评论 -
Appleman and Card Game(贪心)
原题链接 B. Appleman and Card Game time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Appleman has n cards. Each card has an uppercase letter wri原创 2016-08-03 08:04:15 · 421 阅读 · 0 评论 -
Little Dima and Equation(枚举)
原题链接 B. Little Dima and Equation time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Little Dima misbehaved during a math lesson a lot and the原创 2016-08-03 07:59:11 · 347 阅读 · 0 评论 -
Laptops
原题链接 A. Laptops time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output One day Dima and Alex had an argument about the price and quality of lapto原创 2016-08-03 07:53:47 · 721 阅读 · 0 评论 -
Table Decorations(贪心)
原题链接C. Table Decorations time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output You have r red, g green and b blue balloons. To decorate a single原创 2016-08-03 07:37:01 · 509 阅读 · 0 评论 -
D-City(并查集)
原题链接 D-CityTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 3694 Accepted Submission(s): 1319Problem Description Luxer is a really bad guy.原创 2016-08-11 19:20:47 · 403 阅读 · 0 评论 -
Anniversary party(树形DP)
原题链接 Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6833 Accepted: 3941 DescriptionThere is going to be a party to celebrate the 80-th Anniversary of the Ural原创 2016-08-11 17:28:51 · 299 阅读 · 0 评论 -
number(数位DP)
原题链接 numberTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5010 Accepted Submission(s): 2874Problem Description A wqb-number, or B-number原创 2016-08-11 16:50:34 · 378 阅读 · 0 评论 -
命运
原题链接 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧! 命运大迷宫可以看成是一个两维的方原创 2016-08-11 16:30:06 · 419 阅读 · 0 评论 -
最大连续子序列(线性DP)
原题链接 最大连续子序列Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28344 Accepted Submission(s): 12874Problem Description 给定K个整数的序列{ N1, N2, …, N原创 2016-08-11 16:23:54 · 290 阅读 · 0 评论 -
How Many Answers Are Wrong(并查集)
原题链接 How Many Answers Are WrongTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5958 Accepted Submission(s): 2252Problem Description TT and原创 2016-08-09 19:08:46 · 347 阅读 · 0 评论 -
Fox And Jumping(0-1背包)
原题链接 B. Fox And Jumping time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Fox Ciel is playing a game. In this game there is an infinite lon原创 2016-08-06 13:31:24 · 860 阅读 · 0 评论 -
跑跑卡丁车(0-1背包)
原题链接 这个题其实也是01背包解决的问题,只是他的状态转移方程是分段的而不是不同的那样是只有一个,同时题中的氮气其实只需要把他当成是0~14就可以而不用当成0~280这么多,同时由于其氮气是不断变化的,所以不能用一个一维数组来存储dp,而是应该用二维的数组来存储,否则这个状态转移方程就无法表示#include <cstdio>#include <cstring>#include <a原创 2016-08-06 10:47:41 · 484 阅读 · 0 评论 -
滑雪(线性dp)
原题链接 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 91605 Accepted: 34586 DescriptionMichael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael原创 2016-08-06 10:30:36 · 314 阅读 · 0 评论 -
Ice Cave(BFS)
原题链接 C. Ice Cave time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output You play a computer game. Your character stands on some level of a multi原创 2016-08-04 23:38:03 · 927 阅读 · 0 评论 -
非常可乐(BFS和最短路)
原题链接 非常可乐 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u SubmitStatus Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐...原创 2016-08-04 23:28:20 · 374 阅读 · 0 评论 -
连连看(DFS)
原题链接 连连看 Time Limit:10000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u SubmitStatus Description “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋原创 2016-08-03 23:47:31 · 530 阅读 · 0 评论 -
符号三角形
原题链接 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u SubmitStatus Description 符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”原创 2016-08-03 23:10:23 · 505 阅读 · 0 评论 -
New Year Book Reading(贪心)
原题链接 C. New Year Book Reading time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output New Year is coming, and Jaehyun decided to read many books原创 2016-08-03 08:22:23 · 739 阅读 · 0 评论 -
An Old Problem
原题链接1129: An Old 时间限制: 1 Sec 内存限制: 128 MB 提交: 492 解决: 88 [提交][状态][讨论版] 题目描述给定一个n*m的矩阵,要求支持下面的操作: 0 x y:交换第x行与第y行 1 x y:交换第x列与第y列输入多组数据。对于每组测试数据,第一行包含三个数n,m,k(1<=n,m<=1000;1<=k<=100000),分别表示行数,列数原创 2016-08-24 00:13:10 · 375 阅读 · 0 评论