自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 并查集(擒贼先擒王)

靠左原则:左边的是团伙的头头擒贼先擒王原则:让团伙之间的大BOSS自己决定谁归顺谁。并查集算法:并查集通过一个数组来实现,其本质是维护一个森林。刚开始的时候,森林的每个点是孤立的,也可以理解为每个点就是一棵只有一个结点的树,之后通过一些条件,逐渐将这些树合并成一棵大树。其实合并的过程就是每次判断两个结点是否已经在同一棵树中的时候...

2021-02-20 21:23:24 175

原创 堆——神奇的优先队列

堆就是一种特殊的完全二叉树。有没有发现这棵二叉树有什么特点?就是所有的父结点都比子结点要小(注意:圆圈里面的数是值,圆圈上面的数是这个结点的编号)。符合这样特点的完全二叉树我们称为最小堆。反之,如果所有的父结点都比子结点要大,这样的完全二叉树称为最大堆。假如有14个数,分别是99、5、36、7、22、17、46、12、2、19、25、28、1和92 。现在我们需要删去其中的最小数并且增加一个23,再求这14个数中的最小数。首先我们把这14个数按照最小堆的要求(就是所有的父结点都比子结点要小)放入一棵

2021-02-18 18:53:42 277

原创 二叉树

二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子,左边的叫左儿子,右边的叫右儿子,或者说每个结点最多有两棵子树。更加严格的递归定义是:二叉树要么为空,要么是由根结点、左子树和右子树分别是一棵二叉树。下面这棵树就是一棵二叉树。一棵多叉树也可以转化为二叉树。二叉树中还有两种特殊的二叉树,叫做满二叉树和完全二叉树。满二叉树:如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫满二叉树。或者说满二叉树所有的结点都有同样的深度。比如下面这棵二叉树,是不是感觉很“丰满”?满二叉树的严格定义是一

2021-02-10 21:08:13 803

原创 hdu2004

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2004用if,else语句:AC代码一:#include <bits/stdc++.h>using namespace std;int n;int main(){ while(cin >> n){ if(n >= 90 && n <= 100) cout << "A" << endl; else if(n &gt

2021-02-10 11:25:10 145

原创 hdu2002

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2002注意提示#define PI 3.1415927这里的π值有七位小数。而float只有六位有效数字。在要求7位的π值情况下,要获得准确的计算结果,必须使用double类型。代码:#include <bits/stdc++.h>using namespace std;#define PI 3.1415927double a, ans;int main(){ while(c

2021-02-10 11:03:06 115

原创 模拟大数加法

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002分析:列竖式!代码:#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3ftypedef long long ll;const int N = 1e3 + 7;#define jiechufengyin std::ios::sync_with_stdio(0);cin.tie(0);cout.tie(0

2021-02-09 16:22:42 126

原创 最短路径算法对比分析

我们选择最短路径算法时,要根据实际需求和每一种算法的特性,选择合适的算法。Floyd算法虽然总体时间复杂度高,但是可以处理带有负权边的图(但不能含有负权回路)并且均摊到每一点的对上,在所有的算法中还是属于较优的。另外Floyd算法较小的编码复杂度也是它的一大优势。所以,如果要求的是所有点对间的最短路径,或者数据范围较小,则Floyd算法比较适合。Dijkstra算法最大的弊端是它无法处理带有负权边已经负权回路的图,但是Dijkstra算法具有良好的课扩展性,扩展后可以适应很多问题。另外用堆优化的Dij.

2021-02-09 12:56:27 687

原创 Bellman-Ford算法的队列优化

算法优化核心思维:每次仅对发生变化了的点的相邻边执行松弛操作。但是如何知道当前哪些点的最短路径发生了变化呢?这里可以用一个队列来维护这些点,算法大致如下:每次选取队首顶点u,对顶点u的所有边进行松弛操作。例如有一条u->v的边,如果通过u->v这条边使得源点到顶点v的最短路程变短(dis[u] + e[u][v] < dis[v]),且顶点v不在当前的队列中,我们就将顶点v放入队尾。需要注意的是,同一个顶点同时在队列中出现多次是毫无意义的,所以我们需要一个数组来判重(判断哪些点已经在队

2021-02-09 12:31:23 485 1

原创 Bellman-Ford算法(解决负权边)

核心代码:for (int k = 1; k <= n - 1; ++k){ for (int i = 1; i <= m; ++i){ if(dis[v[i]] > dis[u[i]] + w[i]) dis[v[i]] = dis[u[i]] + w[i]; }} 上面的代码外层循环一共循环了n - 1次(n为顶点个数), 内层循环循环了m次(m为每一条边),即枚举每一条边。dis数组的作用与Dijkstra算法一样,是用来记录源点到其余各个顶点的最短路径的。u、

2021-02-09 10:07:31 708 1

原创 abs、fabc、acos、double输入输出

abs和fabs函数区别abs():求绝对值函数fabs():求绝对值函数abs( )主要用于对求整数的绝对值,在“stdlib.h”(或 )头文件里面。而fabs( )主要是求精度要求更高的double ,float 型的绝对值,在头文件里。两者在只#include时都可以使用...

2021-02-06 14:11:10 793

原创 唯一分解定理

模板:1.去重过的:typedef long long ll;ll fac[10050], num;//素因数,素因数的个数void init(ll n) {//唯一分解定理 num = 0; ll cpy = n; int m = (int)sqrt(n + 0.5); for (int i = 2; i <= m; ++i) { if (cpy % i == 0) { fac[num++] = i;

2021-02-04 19:36:11 133

原创 gcd(概念+例题)

模板:例题:例题1:https://sdnuoj.rainng.com/problem/show/1354代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define inf 0x3f3f3f3fconst int N = 100 + 7;const int M = 1e6 + 7;ll n, longcable[N], num;ll gcd(ll a, ll b){ retur

2021-02-04 16:06:28 256

原创 模拟

模拟大数乘法:例题:https://sdnuoj.rainng.com/problem/show/1232分析:由乘法竖式得到灵感代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define inf 0x3f3f3f3fconst int N = 1e3 + 7;const int M = 1e6 + 7;string sa, sb;int a[N], b[N];int sum[M

2021-02-04 10:40:25 142

原创 打表(例题 + 概念)

打表:打表,是一个信息学专用术语,意指对一些题目,通过打表技巧获得一个有序表或常量表,来执行程序某一部分,优化时间复杂度。这种算法也可用于在对某种题目没有最优解法时,用来得到分数的一种策略。...

2021-02-03 19:28:10 1979

原创 判断一个数是否是素数

哥德巴赫猜想**内容:**任一大于2的整数都可写成三个质数之和判断是否是素数法一:首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;证明:令x≥1,将大于等于5的自然数表示如下:······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不

2021-02-02 13:49:43 321

原创 快速幂(例题+模板)

模板1://来自lra师哥 typedef long long ll;ll q_pow(ll a, ll b){ ll ans = 1; while(b > 0){ if(b & 1){ ans = ans * a % mod; } a = a * a % mod; b >>= 1; } return ans;} 例题1:https://sdnuoj.rainng.com/problem/show/1081代码:#include &lt

2021-01-30 10:09:44 319

原创 Dijkstra算法(单源最短路)

1.储存这里仍用一个二维数组来储存顶点之间边的关系。除此之外,我们还需要一个dis数组来储存1号顶点到其余各个顶点的初始路程。如:dis = {0,1,12,inf,inf,inf}(这里inf是无穷大)我们将此时dis数组中的值称为最短路径的“估计值”(没有计算过最短路径之前1号顶点到其余各点之间的路程)。2.松弛既然是计算1号顶点到其余各点之间的最短路程,那就先找一个离1号顶点最近的顶点。通过数组可知离1号顶点最近的顶点是2号顶点。接下来看2号顶点有哪些出边呢?有2->3和2->4

2021-01-29 20:46:42 323

原创 Floyd-Warshall算法(多源最短路径问题)

1.用一个二维数组存储图的信息。如:map[1][2] = 2,表示1号城市 到2号城市的路程是2。注意:1.两个城市之间如果没有路,则设两个城市之间的路程为无穷大(inf)2.一个城市到自己的路程是0.如:map[1][1] = 0.3.这些公路是单向的2.思想:根据以往的经验,如果要让任意两个点(例如从顶点a到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转,即:a->k->b,才可能缩短原来从顶点a到顶点b的路程。那么这个中转顶点k是1~n中的哪一个呢

2021-01-29 11:32:43 371

原创 阶梯博弈(尼姆博弈进阶)

例题问题描述:(网址:http://poj.org/problem?id=1704)DescriptionGeorgia and Bob decide to play a self-invented game. They draw a row of grids on paper, number the grids from left to right by 1, 2, 3, …, and place N chessmen on different grids, as shown in the fo

2021-01-27 17:14:44 368

原创 公平组合博弈(Impartial Combinatori Games)

1、定义:(1)两人参与。(2)游戏局面的状态集合是有限。(3)对于同一个局面,两个游戏者的可操作集合完全相同(4)游戏者轮流进行游戏。(5)当无法进行操作时游戏结束,此时不能进行操作的一方算输。(6)无论游戏如何进行,总可以在有限步数之内结束。2、模型:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。事实上,这个游戏可以认为是所有公平组合游戏(Impartial Combinatori Games)的抽象模型。其实,任何一个ICG都可以

2021-01-27 17:03:43 429

原创 Fibonacci博弈

1、问题模型:有一堆个数为n的石子,游戏双方轮流取石子,满足:(1)先手不能在第一次把所有的石子取完;(2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家。2、解决思路:结论:当n为Fibonacci数的时候,必败。f[i]:1,2,3,5,8,13,21,34,55,89……用第二数学归纳法证明:为了方便,我们将n记为f[i]。1、当i=2时,先手只能取1颗,显然必败,结论成立。2、假设当i<=k时,结

2021-01-27 16:59:17 142

转载 博弈序章

博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。此类问题一般有如下特点:1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。3、公平博弈。即两人进行决策所遵循的规则相同。理论铺垫:1、定义P-position和N-position:其中P代表Previous,N代表Next

2021-01-27 16:51:25 154

原创 尼姆博弈

有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜。思路:首先自己想一下,就会发现只要最后剩两堆物品一样多(不为零),第三堆为零,那面对这种局势的一方就必败。①那我们用(a,b,c)表示某种局势,首先(0,0,0)显然是必败态,无论谁面对(0,0,0) ,都必然失败;②第二种必败态是(0,n,n),自己在某一堆拿走k(k ≤ n)个物品,不论k为多少,对方只要在另一堆拿走k个物品,最后自己都将面临(0,0,0)的局势,必败。③仔细分析一下,(1,2,3

2021-01-27 16:48:29 908

原创 威佐夫博奕

威佐夫博弈(Wythoff’s game)是指的这样一个问题:有两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜利。我们用(a[k],b[k]) (a[k] ≤ b[k] ,k=0,1,2,…n)来表示两堆物品的数量,并且称这个为局势。首先我们来从最简单的情况开始分析:如果现在的局势是(0,0),很明显此时已经没有办法再取了,所以肯定是之前的人在上一局中取完了。假设现在的局势是(1,2),那么先手只有四种取法。(

2021-01-27 16:31:06 351

原创 巴什博奕(Bash Game)

巴什博弈(Bash Game,同余理论):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,

2021-01-26 16:40:29 802

原创 stringstream(2021-1-25)

1.头文件:#include < sstream >< sstream> 主要用来进行数据类型转换,由于 使用 string 对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言, < sstream> 更加安全、自动和直接。< sstream > 定义了三个类:istringstream、ostringstream 和

2021-01-25 16:14:18 216

原创 sscanf(2021-1-25)

sscanf函数例题链接:https://sdnuoj.rainng.com/problem/show/1113代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;ll lena, lenb, m, n, sum;​int main(){ char a[10 + 2], b[10 + 2], A[100], B[100]; while(cin >> A >&gt

2021-01-25 11:31:07 162

原创 讲得好的网址

递归与分治:https://www.cnblogs.com/monkey-home/p/12565709.html排序:https://www.cnblogs.com/onepixel/p/7674659.htmlDP:https://www.bilibili.com/video/BV1X741127ZMfrom=search&seid=1760671235022556274

2021-01-24 13:04:58 126

原创 奇奇怪怪的错误原因

1.写好了函数但未在主函数里调用2.计算多个sum时未在每次计算之前初始化为03.No写成NO4.未初始化5.For循环括号里写的变量是j,后面的语句变量就变成了i6.Sort函数+n中n的值少17.While前面写的自变量是j,括号里的循环条件变成了关于i的,导致陷入了死循环,不出结果。8.忘记给while循环设置出口9.Main写成mian。显示错误语句:ld returned 1 exit status扩展:10.第1043题,没有优化?

2021-01-24 13:03:35 131

原创 前缀和差分例题

前缀和1657.前缀和ⅠTime Limit: 1000 MS Memory Limit: 32768 KBTotal Submission(s): 49 Accepted Submission(s): 24Description给出 个整数 .次查询,每次查询给出一个整数 ,要求输出 .Input第一行有两个正整数, 表示数组长度, 表示询问次数.第二行有 个整数 .接下来 行,每行有一个整数 表示查询 ...Output对于每组询问输出一个整数代表 的

2021-01-24 12:53:48 496

原创 DP学习笔记(闫氏DP分析法)

闫氏DP分析法1.从集合角度 来分析DP问题DP问题都是有限集中的最优化问题(从某个集合中求最值数量或是否存在)枚举时间复杂度太高,用DP可以优化。2.DP为什么可以优化(DP分析过程)1.化零为整(状态表示):1)集合:f(i)这个集合可以表示一类东西,而不只是一个东西2)属性:集合中存的数字和集合的关系(一般有三种:max,min,count)2.化整为零(状态计算):用椭圆表示集合f(i),再将f(i)划分成若干个子集。1)划分条件:不重复、不遗漏2)划分依据:找最后一个不同点

2021-01-24 11:40:26 850 1

原创 2021-1-17(0x3f3f3f3f)

一、哈夫曼编码思想先把数量小的石子合并,数量大的石子最后合并,这样最后的代价就是最小的。对应的就是哈夫曼树的构建过程,该算法保证了二叉树的权值最优性。二、0x3f3f3f3f无穷大。1.0x3f3f3f3f的十进制是1061109567,是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。2.由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷

2021-01-17 16:40:55 292 1

原创 师哥讲课

前缀和、差分等循环最好从1开始int最大值2^31-1最小值是-2^31超时:关同步(解除封印)但有时候还是比scanf慢,scanf更温和做题第一步:分析int够不够快读:m = read();

2021-01-10 21:42:23 109

原创 2021-01-10

C++内存模型1.五个区域:栈区:先创建的后被销毁。很小,很珍贵。在局部变量里,main函数里面。堆区:mallcao,free创建的时候储存的地方,由自己控制,其他是由编译器控制。全局/静态变量区:放全局变量DATA:已经初始化的BSS:未初始化的(每次运行前初始化为0)代码区:常量区:2.不能返回局部变量指针:在函数里创建一个变量,变量存在栈里面,出函数之后,原本存储在栈里面的变量就被销毁了,所以不能返回。3.内存泄露:new,delete。创建完变量之后要释放,不然就会永远存在,丧

2021-01-10 19:19:50 211

原创 1013石子合并简化版(用优先队列:priority_queue实现)

1013.石子合并简化版Time Limit: 1000 MS Memory Limit: 32768 KBTotal Submission(s): 986 Accepted Submission(s): 218Description有n堆石子,每次从中抽取两堆进行合并,合并后的石子数记做权,并把合并后的石子堆当做新的一堆放回,重新随机抽取两堆石子,重复上面的操作,直到所有石子合并成一堆,则每次合并的和的总和是多少?Input第一行:石子的堆数n(1 <= n <= 10

2020-11-26 17:03:32 446

原创 1209磊磊的随机数

题目:1209.磊磊的随机数Time Limit: 1000 MS Memory Limit: 32768 KBTotal Submission(s): 327 Accepted Submission(s): 179Description磊磊想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序

2020-11-02 20:15:11 199

转载 矩阵乘法(二维数组例题)

题目:编程求两个矩阵相乘的结果。输入第一行是整数m,n,表示第一个矩阵是m行n列的。接下来是一个m*n的矩阵。再下一行的输入是整数p,q,表示下一个矩阵是p行q列(n=p),再接下来就是一个p行q列的矩阵。要求输出两个矩阵相乘的结果矩阵(1《m,n,p,q《=8)。输入样例: 输出样例:2 3 10 19 302 4 5 4 8 162 1 33 31 1 12 3 20 1 4#include <bits/stdc

2020-10-27 21:24:57 2396

原创 1058人名查询(sdnuoj)

1058人名查询(sdnuoj)Description给定 n 个人名和 m 个查询,每个查询给定一个人名,对于每个查询,输出该查询中给定的人名是否在之前给定的 n 个人名中出现过。Input第一行为两个整数n(1 <= n <= 10000), m(1 <= m <= 1000),之后n行每行一个人名,之后m行每行一个人名,表示每次查询。人名为大小写字母组成,最大长度为100。Output对于每个查询,输出一行,若该查询的人名出现过,输出YES,否则输出NOSampl

2020-10-26 21:22:48 854

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除