![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM总结与模板
知足--常乐
这个作者很懒,什么都没留下…
展开
-
整数快速幂-归纳法
计算x的n次幂的朴素算法复杂度为O(N),我们还有一种复杂度为O(log N)的快速幂方法。基本思想:1. 令m=n/2。 假设已经知道如何计算xm,再来求xn。2. 分两种情况:如果n为偶数,xn=(xm)2如果n为奇数,xn=x(xm)2根据这个思想,可以得出递归的算法:伪代码: C++代码:...原创 2017-07-31 20:00:59 · 499 阅读 · 0 评论 -
KMP算法总结(转)
文章篇幅有点长,但是最后一张图真的很棒,希望读者坚持慢慢看到最后,必有收获。字符串单模式问题描述:给定文本串text,和模式串pattern,在文本串text中找到模式串pattern第一次出现的位置。一、最基本的字符串单模式匹配算法:暴力求解(Brute Force):时间复杂度O(m*n)设文本串text = “ababcabcacbab”,模式串为patten = “abcac”原创 2017-08-14 08:33:50 · 601 阅读 · 3 评论 -
ACM_大牛总结的线段树专辑
【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~;并转载 2017-08-15 08:36:36 · 1085 阅读 · 0 评论 -
OJ提交时G++、C++的区别(转)
用C++代码敲代码,一般都会用C++提交,但是后由于一些细微的不同使用不同的编译方式还是会产生差别的,甚至是WR和AC的天壤之别。原来只知道C++能用C++提交,但是原来G++…从网上找了点资料:G++是GNU的那个C++编译器,也是Dev-CPP自带的编译器和NOI系列赛官方的编译器。。而C++是VC++,是微软出的编译器。。。 一般来说,两个结果不一样,要么是因为G++效率略低被卡掉,要么是因原创 2017-09-19 10:50:49 · 669 阅读 · 1 评论 -
最小生成树-Prim算法和Kruskal算法(转)
Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:R原创 2017-09-19 11:57:19 · 616 阅读 · 0 评论 -
背包问讲解(转)
大一刚接触背包问题的时候就觉得绕。那时候真的是一点代码基础都没有强行去理解。每次都是以失败告终,一直到大二都还不会写背包问题。 后来某次模拟赛之后碰到了背包问题,觉得这个还是挺简单的,终于是下定决心准备搞一搞这个东西了。 有了一定的基础理解起来就比以前容易多了。 首先,先分清楚这三个背包问题。 1.01背包:有n种物品与承重为m的背包。每种物品只有一件,每个物品都有对应的重量weight[i原创 2017-11-06 21:02:38 · 242 阅读 · 0 评论 -
ACM_最短路讲解
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假...原创 2017-08-17 10:15:07 · 1481 阅读 · 0 评论 -
ACM博弈论总结
常用的4个博弈论算法 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈1.巴什博奕只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个原创 2017-12-13 20:36:18 · 481 阅读 · 0 评论 -
ACM_KMP模板
KMP模板 其实 每道题的区别在于 你的模式串在文本庄中匹配到了 接下来的操作 都只在kmp函数末尾的操作发生变化1.如果 是类似统计布条 即每次找到的字符串没有重合部分 求出sumif (j==m) { sum++; j=0; } return sum;2.如果统计的字符串可以重合 、 if (j==m) { sum++;原创 2017-12-15 15:45:41 · 407 阅读 · 0 评论 -
AC自动机模板
AC自动机是多模式匹配 其他和字典树用法差不多的 主要区别是在寻找多个时 将相同的子串建立关系 建立fail指针void getfail() //建立fail指针{ int i; node *p; p = root; queue<struct node *>qu; qu.push(p); while (!qu.empty()) {原创 2017-12-15 16:25:07 · 220 阅读 · 0 评论 -
STL中的set使用方法详细!!!!
1.关于setC++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让原创 2018-01-19 16:47:26 · 90527 阅读 · 26 评论 -
如何根据前序、中序、后序遍历还原二叉树
在网上看到了一篇 讲的挺好的还原二叉树的博客 分享一下 附上原文链接 : http://blog.csdn.net/yanerhao/article/details/45175943首先我们得知道概念:前序遍历:先访问当前节点,再访问当前节点的左子树,最后访问当前节点的右子树。对于二叉树,深度遍历与此同。规律:根在前;子树在根后且左子树比右子树靠前,且第一个就是根节点;中序遍历:...原创 2018-03-08 20:57:27 · 11897 阅读 · 1 评论 -
素数筛选法
剔除2 3 4 5 6 … … 的倍数就像2是素数,所有是2的倍数的肯定都不是素数,这时候标记上,接着判断3是素数,所有是3的倍数的都肯定不是素数,这时就要标记上,以此下去,执行到根下(总数),这样就会得到一个素数表,所有没有被标记的都是素数,下面是具体的代码实现,代码里面有注释。写的很清楚。#include <iostream>#include <string.h&g...原创 2018-03-12 21:03:44 · 209 阅读 · 0 评论 -
ACM_线段树模板(单点更新)
#define maxn 1000001//const int maxn = 100001;int sum[maxn];void update(int root) //单节点更新{ sum[root] = sum[root<<1] + sum[root<<1|1];}void build(int left, int right, int root) //建树{原创 2017-08-14 14:54:25 · 703 阅读 · 0 评论 -
ACM_字典树模板
函数部分struct node { int t; node *child[2]; //看情况开大小 node() //结构体初始化 { t=0; for (int i=0 ;i<2; i++) { child[i]=NULL; } } };原创 2017-08-13 11:22:32 · 423 阅读 · 0 评论 -
C++ STL replace()函数常用用法详解
replace算法: replace函数包含于头文件#include<string>中。 泛型算法replace把队列中与给定值相等的所有值替换为另一个值,整个队列都被扫描,即此算法的各个版本都在 线性时间内执行———其复杂度为O(n)。 即replace的执行要遍历由区间[frist,last)限定的整个队列,转载 2017-07-29 10:06:09 · 2312 阅读 · 0 评论 -
ACM_线段树模板(区间更新)
#include <iostream>#include <bits/stdc++.h>using namespace std;int ans[1000000],n;struct node{ int l,r,n;}a[1000000];void build(int left, int right ,int root){ a[root].l = left; a[ro原创 2017-08-15 08:21:12 · 594 阅读 · 0 评论 -
栈+队列+优先队列-总结
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习。首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个阶段再去探究具体的实现,以及对基本结构的改造!C++标准库中的基本使用方法:栈: #include<stack>定义栈,以如下形式实现: stack s; 其中Type为数据类型(如 int,float,转载 2017-07-24 19:46:41 · 300 阅读 · 0 评论 -
针对复杂度总结
算法的时间复杂度和空间复杂度合称为算法的复杂度。 1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度转载 2017-07-24 19:54:59 · 202 阅读 · 0 评论 -
遍历除本身以外的其他位(特殊思想)
假如有一个数组 a[10]={1,2,2,2,5,6,7,8,9,10}; 如果 要去重的话 常规方法: if () continue;for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { if (i==j) continue;原创 2017-08-02 15:16:23 · 371 阅读 · 0 评论 -
c++中字符串反转的3种方法
第一种:使用algorithm中的reverse函数?123456789101112131415#include <iostream>#include <string>#include <algorithm>using namespace std; int main(){ string s = "hello"; reverse(s.begin(),s.end()); cout<转载 2017-07-27 14:58:56 · 2007 阅读 · 0 评论 -
ACM_并查集总结(转)
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行原创 2017-08-11 20:31:21 · 1463 阅读 · 1 评论 -
ACM_最短路模板(SPFA,Dijkstra,Floyd)
Floyd:void floyd(){ int i,j,k; for (k=1; k<=n; k++) for(i=1; i<=n; i++) for (j=1; j<=n; j++) Map[i][j]=min( Map[i][j],Map[i][k]+Map[k][j] );}Dijkstravoid Di原创 2017-08-19 08:12:01 · 1413 阅读 · 0 评论 -
使用0x3f3f3f3f表示无穷大
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大转载 2017-07-27 18:25:05 · 352 阅读 · 0 评论 -
Floyd算法
来自百度百科Floyd算法弗洛伊德算法一般指Floyd算法Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。中文名弗洛伊德算法外文名Floyd(Floyd-Warshall)时间复杂度O(n^3)空间复杂度O(n^2)作转载 2017-07-27 18:27:02 · 649 阅读 · 0 评论 -
线段树基本入门知识
在学习线段树之前,我们先来了解一下二叉树。线段树的构造思想线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。根节点表示的是“整体”的区间。对于每一个非叶结点所表示的区间[a,b]: 左儿子表示的区间为[a,(a+b)/2]右儿子表示的区间为[(a+b)/2+1,b] 概念:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元转载 2017-07-27 18:29:08 · 245 阅读 · 0 评论 -
动态规划(dp)讲解
今天在网上看到一个讲动态规划的文章,是以01背包为例的,这文章和书上的讲解非常不一样,令我眼前一亮,于是转载一下下~~~(说明一下,本人非常痛恨教材公式定理漫天飞,实际的讲解却讲得非常枯涩难懂,这种中国式的教育已经延绵了几千年了,现在中国的教材还是这个样子,讲清楚些明白些就那么难么?高中有个老师讲的一句话一直觉得很有道理:“教得会天才不是真本事,能把博士生的东西讲到小学生都会用那才是真水平。”)转载 2017-07-27 18:31:27 · 461 阅读 · 0 评论 -
STL之二分查找(binary_search(),lower_bound(),upper_bound() )
二分查找(二分检索): 二分法检索又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与 字典中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在字典前半部分中继续进行二分法检索;若 key大,则在字典后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索转载 2017-07-29 09:48:09 · 470 阅读 · 0 评论 -
2018.4-天梯赛~蓝桥杯总结
4月1号2号参加了天梯赛和蓝桥杯 也是在大学生涯第二次参加天梯赛,第一次参加蓝桥杯。 先说一下天梯赛吧。去年的天梯赛感觉就并不是特别好,拖了后腿,今年还是这个感觉~~不尽如人意。虽然天梯赛今年的整体难度较去年整体是上升,但也仅仅是在中档题目难度的上升,简单题还是没有什么难度。其实赛程过半的时候L1的题其实只剩第一道20分的题了,L1的其他题,有些没有拿满分也没太在意,但当时队伍情况是真的不到8...原创 2018-04-09 17:24:57 · 1759 阅读 · 0 评论