01 2022 档案

摘要:一、Prim算法 Prim算法时间复杂度为O(n ^ 2) Prim算法的具体思路是,每次根据最小那条边的顶点松弛边,然后再根据dis数组继续松弛,一直到n-1条边数完。 优化后的时间复杂度为O(nlogn) 1 #include "bits/stdc++.h" 2 using namespace 阅读全文
posted @ 2022-01-30 14:46 scannerkk 阅读(258) 评论(0) 推荐(0) 编辑
摘要:一、Segment_tree 1.什么是线段树? 其实就是以类似于数组的形式存储了一些有关的信息,比如一段区间的和,一段区间的最大值最小值之类的问题 2.为什么需要线段树呢? 当我们需要查询某个区间的最大值最小值的时候我们需要扫一遍查询的区间,而当我们查询的次数为n次时,时间复杂度趋于O(n^2)。 阅读全文
posted @ 2022-01-28 21:59 scannerkk 阅读(49) 评论(0) 推荐(0) 编辑
摘要:一、题目分析 A.Min Max Swap 题意:给你两个数组,你可以操作任意次,a【i】和b【i】交换,要求你求出a数组最大值和b数组最大值相乘的最小值。 你把较大的放入a数组,然后把较小的放入b数组,这样两个数组的最大值相乘一定是最小值。 代码实现: 1 #include <bits/stdc+ 阅读全文
posted @ 2022-01-28 19:33 scannerkk 阅读(32) 评论(0) 推荐(0) 编辑
摘要:一、邻接表 1.为什么需要邻接表? 答:当遇到的是稀疏图的情况下如果用邻接矩阵去存储的话,时间复杂度会是O(n^2),空间复杂度也会是O(n^2),其实这样是非常划不来的,因为你有很多空间没有用掉,所以就有了邻接表的存储方式 2.邻接表是什么? 答:可以把它当做一个链表来看待,他就是利用指向的形式寻 阅读全文
posted @ 2022-01-28 19:28 scannerkk 阅读(916) 评论(0) 推荐(0) 编辑
摘要:1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long ll; 4 inline ll read()//内联函数可以节省调用的开销,而且能够便于编译器和上下文配合做优化 5 { 6 ll s = 0,w = 1; 7 阅读全文
posted @ 2022-01-25 15:26 scannerkk 阅读(86) 评论(0) 推荐(0) 编辑
摘要:一、题目分析 A.Download More RAM 题意是给定你初始内存,和n个软件,每次运行一个软件如果你能成功运行,你就能得到永久的内存,问你最后能得到的RAM最大值为多少 按软件对内存的需求从小到大排个序,这样你能获得的永久内存越多 1 #include "bits/stdc++.h" 2 阅读全文
posted @ 2022-01-23 22:31 scannerkk 阅读(30) 评论(0) 推荐(0) 编辑
摘要:一、AVL树简介 AVL树是一棵自平衡的二叉搜索树,前篇讲过了BST(二叉搜索树),那为什么还需要AVL树呢,因为BST有个缺点,如果我插入的值是单调递增或递减,那么这棵树就会退化成一条链表,有个专业术语也叫作斜树,这会导致原来logn的搜索插入效率变成O(n),为了防止这种退化,就产生了AVL树, 阅读全文
posted @ 2022-01-21 20:07 scannerkk 阅读(790) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 这个题目挺有意思的,刚开始以为是个并查集的模板题,后面交上去只有36分,仔仔细细看了一下题,发现这并不是双向关系,而并查集是双向的。因此我就想了一个有疑问的想法,在合并祖先的时候,把那些祖先不等于自己的标记一下,最后计算祖先等于自己的或者未被标记的加上去就行了,虽然是10 阅读全文
posted @ 2022-01-20 20:30 scannerkk 阅读(29) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 如果n个村庄要想通村,而这个公路又是双向的,那么就只需要n-1条边就行了,因此我们只需要解决的问题就是时间最少的问题了,我们只需要按时间进行一个快排就行了,然后判断是否拿到了n-1条边,拿到了就更新ans推出循环就行了,如果修完了m条路都没有n-1条边,那么就不能通车,输 阅读全文
posted @ 2022-01-20 20:18 scannerkk 阅读(95) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 这个题目我觉得题意有点问题的,后面把并查集的模板改成等于就行了,也就是计算两个公司认识1号人的人数取个最小值,因为你不可能凭空造人,对吧? 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int a[1 阅读全文
posted @ 2022-01-20 20:14 scannerkk 阅读(32) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 很容易看出来这是并查集模板题 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int a[10000]; 4 int find(int u) 5 { 6 if(u == a[u]) 7 return a 阅读全文
posted @ 2022-01-20 20:10 scannerkk 阅读(44) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 看到这个题目的时候我就觉得这是一个有依赖的背包,可以用树形dp,但是我不会,就用并查集预处理+01背包就解决了 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int dp[11000]; 4 int 阅读全文
posted @ 2022-01-20 20:09 scannerkk 阅读(27) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 刚开始没怎么看懂题目,后面画着画着树就知道了这个原理,其实这个题目就是让我们求根据前序和中序所能得到的树最多有多少棵。而造成两个序列不同树的情况就是单子树的情况,因此我们需要数单子树的个数,答案就是2^n次方怎么数呢? 如果前序里的字符和后序里的字符相等,且他们的后一个和 阅读全文
posted @ 2022-01-20 20:06 scannerkk 阅读(37) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 根节点为第1层,然后根据每次输入建树,用bfs求解,或者建的时候直接数层数也行。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 int l; 5 int r; 6 }Tr 阅读全文
posted @ 2022-01-20 20:01 scannerkk 阅读(35) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 中序+后序推前序,不过推导的过程中出现了下标数错,尴了个大尬。。。。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 char midTree[110]; 4 char aftTree[110]; 5 阅读全文
posted @ 2022-01-20 19:58 scannerkk 阅读(21) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 就是一个构建树,在加上前序打印,水题一只。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 char date; 5 node *left = NULL; 6 node * 阅读全文
posted @ 2022-01-20 19:56 scannerkk 阅读(42) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、题目分析 经典的中序+前序推后序,前面已经分析过了,直接交代码的。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 string P,M; 4 void printAft(int p1,int p2,int le 阅读全文
posted @ 2022-01-20 19:53 scannerkk 阅读(52) 评论(0) 推荐(0) 编辑
摘要:B. Minor Reduction time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a decim 阅读全文
posted @ 2022-01-20 19:43 scannerkk 阅读(51) 评论(0) 推荐(0) 编辑
摘要:A. Equidistant Letters time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a s 阅读全文
posted @ 2022-01-20 19:33 scannerkk 阅读(58) 评论(0) 推荐(0) 编辑
摘要:D. Not Adding time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You have an array a1,a2,…, 阅读全文
posted @ 2022-01-20 19:26 scannerkk 阅读(25) 评论(0) 推荐(0) 编辑
摘要:一、前言 BST及(BinarySearchTree)二叉查找树,TBT及(ThreadedBinaryTree)线索二叉树。二叉查找树在一定程度上能使查找某个数字从线性变成对数级的时间复杂度,但一定程度上也会失效。线索二叉树是利用空余的指针为二叉树建立一个线性阶的查找,能很快的知道某个节点的前驱和 阅读全文
posted @ 2022-01-20 13:49 scannerkk 阅读(153) 评论(0) 推荐(0) 编辑
摘要:一、题目描述 二、解题思路 并查集+快速排序 快速排序把时间少的放在前面,因为要最少时间修好,一共有n个村庄,所以只需要n-1条边即可通路,利用并查集判断是否可以达到同一个村庄,相当于需要增加1条路,当路的条数等于n-1时,便修好了。否则如果在m组公路中无法修好,那么输出-1即可。 三、代码实现 1 阅读全文
posted @ 2022-01-19 21:37 scannerkk 阅读(70) 评论(0) 推荐(0) 编辑
摘要:一、二叉树重构 二叉树重构指的是通过前序和中序,或者中序和后序重新构造出二叉树。 二、中序和前序构造二叉树 给出两个序列: 前序:CBADEFGH 中序:ABEDFCHG 怎么推出后序呢? 首先我们知道前序的遍历顺序是 根左右 中序的遍历顺序是 左根右 因此前序的第一个就是整根数的根节点 然后去中序 阅读全文
posted @ 2022-01-17 22:26 scannerkk 阅读(453) 评论(0) 推荐(0) 编辑
摘要:一、前言 今天学习了下二叉树的构建以及遍历,感觉还是挺简单的。 二、树的构建 我们利用输入的字符串,依次是从根节点到左儿子再到右儿子,也就是根据字符如果不是'#'就创建节点返回,如果是,再创建它的左右节点,依次结束树的创建。 比如说我们输入一串字符串“AB#D##C##”(#代表空) 它的树图为: 阅读全文
posted @ 2022-01-15 21:07 scannerkk 阅读(132) 评论(0) 推荐(0) 编辑
摘要:一.前言: 经过昨天对kmp的复习,以及做了一道模板题,于是就产生了对多字符串匹配算法AC自动机的好奇心。今天一早就开始学习ac自动机,下午调试了一个小时便实现了该算法。首先来介绍一下什么是ac自动机, 所谓ac自动机,并不是自动判题的机器,而是一种多模式匹配算法,我们都知道kmp算法是每次只能对一 阅读全文
posted @ 2022-01-14 16:50 scannerkk 阅读(261) 评论(0) 推荐(0) 编辑
摘要:一、描述: BF、KMP、GKMP(优化后的kmp)都是基于单个字符串(多个字符串一般要用到其他算法,比如说AC自动机)匹配的算法,不过时间复杂度各有不同,其中BF的时间复杂度为O(n * (m - n + 1)),而kmp算法的时间复杂度为O(n + m),可见快上了不少,但是这其中确实还是有不足 阅读全文
posted @ 2022-01-13 17:05 scannerkk 阅读(365) 评论(0) 推荐(0) 编辑
摘要:1 #include "bits/stdc++.h" 2 #include "conio.h" 3 #include "windows.h" 4 using namespace std; 5 typedef struct node{ 6 char name[100];//姓名 7 char phon 阅读全文
posted @ 2022-01-12 18:11 scannerkk 阅读(138) 评论(0) 推荐(0) 编辑
摘要:一、题目描述: 二、题目分析: 观察样例6257只需要7次权势二进制就可以加到n了为什么呢? 1111 * 1+ 1101 * 1 + 1011 * 4 + 101 1111 + 1101 + 4044 + 1 9 9 * 1 分析样例可知只需要找到这个数每位上的最大的那个数,那就是答案 三、代码实 阅读全文
posted @ 2022-01-12 18:04 scannerkk 阅读(33) 评论(0) 推荐(0) 编辑
摘要:回溯基本思路 问题解析解决回溯问题,实际上就是一个决策树的遍历过程其核心就是for循环里面的递归,在递归调用之前做选择,在递归调用之后撤销选择解决思路1.路径:也就是已经做出的选择2.选择列表:也就是你当前可以做的选择3.结束条件:也就是达决策树底层,无法再做选择的条件 回溯三部曲1.递归函数返回值 阅读全文
posted @ 2022-01-12 17:33 scannerkk 阅读(107) 评论(0) 推荐(0) 编辑
摘要:一.埃氏筛: 埃氏筛就是利用每个数的合数一定不是素数,用空间换取时间,筛选出一定范围内的素数。(合数:就是某个数的倍数*2,*3......这种) 代码实现: 1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[1000000]; 4 int mai 阅读全文
posted @ 2022-01-12 17:27 scannerkk 阅读(19) 评论(0) 推荐(0) 编辑
摘要:1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 int i=1,j; 6 int flag=0; 7 long long int m=1,b; 8 int a[31][10]={0}; 9 int c[10]={0}; 10 a[0][1]=1; 1 阅读全文
posted @ 2022-01-12 17:14 scannerkk 阅读(25) 评论(0) 推荐(0) 编辑
摘要:1 #include "stdio.h" 2 int main() 3 { 4 int target = 7; 5 int nums[6] = {2,3,1,2,4,3}; 6 int numsSize = 6; 7 int point1,point2; 8 long long int sum = 阅读全文
posted @ 2022-01-12 17:13 scannerkk 阅读(217) 评论(0) 推荐(0) 编辑
摘要:证明(m * n) % c = (m % c * n % c) % c 设m = ic + p 设n = jc + q 左式等于((ic + p) * (jc + q)) % c 化简得(ijc^2 + iqc + jpc + pq)% c = pq % c 右式等于((ic + p) % c * 阅读全文
posted @ 2022-01-12 16:52 scannerkk 阅读(48) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 简单快速幂和取余运算 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int main() 4 { 5 long long int a,b,p; 6 long long int ans = 1; 阅读全文
posted @ 2022-01-12 16:48 scannerkk 阅读(27) 评论(0) 推荐(0) 编辑
摘要:1 #include <stdio.h> 2 struct stack{ 3 int top; 4 int data[100]; 5 }; 6 struct queue{ 7 int head; 8 int tail; 9 int paper[1000]; 10 }; 11 int book[10] 阅读全文
posted @ 2022-01-12 16:44 scannerkk 阅读(84) 评论(0) 推荐(0) 编辑
摘要:1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 typedef struct Candidates{//创建候选人结构 5 char name[20];//投票人姓名 6 int vote;//投票数 7 stru 阅读全文
posted @ 2022-01-12 16:42 scannerkk 阅读(36) 评论(0) 推荐(0) 编辑
摘要:#include <stdio.h> #include <stdlib.h> typedef struct Node { int val; struct Node *next; }Node,*PNode; typedef struct Stack { struct Node *top; struct 阅读全文
posted @ 2022-01-12 16:40 scannerkk 阅读(25) 评论(0) 推荐(0) 编辑
摘要:1 #include "stdio.h" 2 #include "string.h" 3 int que[100];//定义队列 4 char Ask[100];//定义询问串 5 void pop(int *front,int *top) 6 { 7 if(*front == *top){ 8 p 阅读全文
posted @ 2022-01-12 16:32 scannerkk 阅读(39) 评论(0) 推荐(0) 编辑
摘要:一.前言: 逆波兰表示法 ( Reverse Polish notation , RPN ,或 逆波兰记法 ),是一种是由 波兰 数学家 扬·武卡谢维奇 1920年引入的数学表达式形式,在逆波兰记法中,所有 操作符 置于 操作数 的后面,因此也被称为 后缀表示法 (也称后缀表达式)。而我们平常用的a 阅读全文
posted @ 2022-01-12 12:29 scannerkk 阅读(694) 评论(0) 推荐(0) 编辑
摘要:1 #include "stdio.h" 2 struct node{ 3 int data; 4 int next;//下一个的指针 5 }list[100],space[100]; 6 int Listlen = 0; 7 void init() 8 { 9 for(int i = 0;i < 阅读全文
posted @ 2022-01-11 17:55 scannerkk 阅读(46) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.题目解析: 刚开始一直以为最多只有两个相同个输入字符串,后来意识到看错题了,就开始改,第一遍写重叠个数那个循环的时候从尾巴到头,全wa,第二遍写从头到尾,对三个T三个,第三遍写了个剪枝ac,这个题的思路其实是很简单的,只是实现的时候比较复杂,然后容易出错(调了两个小时)>0<!这 阅读全文
posted @ 2022-01-10 22:05 scannerkk 阅读(34) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 翻译成中文意思大概是这是一个猜数游戏,第1行是答案序列的长度,也是询问的序列的长度(输入0结束),第2行是答案序列,接下来n行是询问序列,直到输入全0结束,每一个询问你都得给出回答,(x,y),x代表的是输入的序列中的数字与答案序列中的数字有几个是吻合的,y代表输入序列中的数字与答案 阅读全文
posted @ 2022-01-10 21:55 scannerkk 阅读(48) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 首先建立一个数组记录流星砸下的位置以及时间,当有相同地方砸下的流星时我们只取最小的那个时间,然后从0,0开始进行bfs即可,如果不能走了,说明Bessie逃不出去,如果他在走的过程中碰到了一个没有被砸过的点,那么这个点一定是花费最小步数的安全点。唯一需要注意的是,流星 阅读全文
posted @ 2022-01-10 12:57 scannerkk 阅读(40) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 刚开始用的打印图形的解法做T了一个点,后面意识到不需要打印图形那么麻烦的操作,直接用一维数组下标代表行号,值代表列。每次选择一列的时候,要判断是否符合。 条件有四个 1.和前面已放置好的皇后不处于同一行 及f!=i,这个条件不需要手动判断,因为你递归的时候已经是往下选 阅读全文
posted @ 2022-01-09 22:02 scannerkk 阅读(35) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 从1开始往下dfs就行了,但是每次循环的开始必须要大于等于前面选择的那个数就ok了。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int a[10] = {0}; 4 void dfs(int 阅读全文
posted @ 2022-01-09 21:55 scannerkk 阅读(145) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 刚开始一直有个错觉,以为左右脑做个贪心就可以了,一交全wa,????,不信,再交一边,又全wa,然后我突然想到了以前学dp的时候,做过一个类似于求解数组分成两部分求和最小题目,这个应该就是那个题目的变形,然后我就开始上模板了,一顿cv,交上去莫名ac。 三.代码实现: 阅读全文
posted @ 2022-01-09 21:51 scannerkk 阅读(95) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 从第1层开始dfs,如果层数已经超过n了则返回,否则每次比较一下当前的苦度和酸度的绝对值,需要注意的是,该层有选择和不选两种情况,所以要进行两条递归。如果比答案小则更新。 三.代码实现: 1 #include "bits/stdc++.h" 2 using names 阅读全文
posted @ 2022-01-09 21:44 scannerkk 阅读(24) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 输入的时候先把各种装置存起来,再记录一下起点坐标,进行bfs,一到装置处就循环找到另一处装置,然后直到到达出口,每次到出口都更新一下到达的最小距离即可。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 阅读全文
posted @ 2022-01-09 21:27 scannerkk 阅读(55) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 简单bfs过即可 三.代码实现: 1 #include "bits/stdc++.h" 2 int n,m,sx,sy,fx,fy; 3 int mx,my,cnt; 4 int mp[15][15]; 5 int bk[15][15]; 6 int mv[4][2] 阅读全文
posted @ 2022-01-09 21:22 scannerkk 阅读(58) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 如果当前点是0的话跑一边bfs判断是否能到边界,如果能到边界,说明并没有形成闭合圈,反之则形成了,然后再跑一边bfs填颜色即可。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int mp[35 阅读全文
posted @ 2022-01-09 21:16 scannerkk 阅读(77) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 从第a层一直dfs即可,不过需要注意的是判断如果大于当前已知答案的步数后要return,不然T两个点。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int n,a,b; 4 int step 阅读全文
posted @ 2022-01-09 21:13 scannerkk 阅读(33) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 马在象棋中是走日的,所以根据这个特点可以写出八个方向,用bfs解决即可,需要注意的是,不需要每一个点都枚举,不然T两个点。可以跑一次就做完所有事情,然后为distance为0的就是不能到达的输出-1即可。 三.代码实现: 1 #include "bits/stdc++ 阅读全文
posted @ 2022-01-09 21:09 scannerkk 阅读(43) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 枚举每一个W点,把八个方向的W全部着色为'.'就行了,每次着色一次就是一个水坑。我被dfsT过很多次,所以直接用bfs实现的。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 char farml 阅读全文
posted @ 2022-01-09 21:03 scannerkk 阅读(39) 评论(0) 推荐(0) 编辑
摘要:一.题目描述: 二.解题思路: 可以先建立一个数组存储要匹配的字符串“yizhong",然后八个方向搜索就行了。 三.代码实现: 1 #include "bits/stdc++.h" 2 using namespace std; 3 int mp[110][110]; 4 char cs[110][ 阅读全文
posted @ 2022-01-09 20:58 scannerkk 阅读(46) 评论(0) 推荐(0) 编辑
摘要:一.冒泡排序: 1 #include "stdio.h" 2 int main() 3 { 4 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 5 for(int i = 0;i < 9;i++)//为什么只有9次外循环? 因为10个数只需要进行9次比较, 6 for(int 阅读全文
posted @ 2022-01-07 22:39 scannerkk 阅读(44) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示