
算法
文章平均质量分 51
21RGHLY
哈哈哈哈
展开
-
欧拉函数= =
代码:原创 2023-05-05 21:04:22 · 2372 阅读 · 0 评论 -
砝码称重(dfs)
过掉50%代码1:(Set自带去重,香的嘞)过掉50%代码2:(st数组去重)原创 2023-03-31 11:35:47 · 150 阅读 · 0 评论 -
2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。本题的结果为一个只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。原创 2023-03-30 19:38:11 · 509 阅读 · 0 评论 -
节点编号是字母的最短路
节点编号是字母的最短路原创 2023-03-26 19:24:28 · 85 阅读 · 0 评论 -
最短路算法
1、Dijkstra算法。原创 2023-03-26 14:40:41 · 99 阅读 · 0 评论 -
邻接表+树的遍历
接下来 n−1行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条有向边。第一行包含整数 n,表示树的结点数。以邻接表的形式输出各个点之间的关系。考虑1号点:(模拟建表)原创 2023-03-24 09:57:48 · 349 阅读 · 0 评论 -
求一棵树的最长路径
题意:给你一颗有根树(一共有n个点,编号为0~n-1),输出从根节点root到叶节点的最长的长度,并输出路径。如果路径有多条,输出序列更小的路径。原创 2023-03-23 21:22:20 · 138 阅读 · 0 评论 -
并查集求连通分量个数、优美的并查集板子
找祖先的数量,祖先的数量即为连通块的数量,并查集基本操作。原创 2023-03-22 09:51:19 · 211 阅读 · 0 评论 -
递归实现排列型枚举
AC代码1:(用普通数组存数字,能更好的展现dfs的过程)AC代码2:(用边长数组存数字)dfs存的状态是当前的位置。原创 2023-03-20 15:13:15 · 214 阅读 · 0 评论 -
二分的绝妙板子,闭区间寻找
2、找到a[]数组中最小的大于等于bi的元素位置la,便可知小于bi的个数为num1。3、找到c[]数组中最大的小于等于bi的元素位置lb,便可知大于bi的个数为num2。4、由于a[]和c[]互斥,通过乘法原理可知符合条件的个数为num1 * num2。注意:当la == 0 或者 lb == n + 1时,则表示不符合条件。1、对3个数组分别进行从小到大排序。AC代码:(太优雅了)原创 2023-03-19 16:01:13 · 111 阅读 · 0 评论 -
SPA = =
题目:题目1:题目描述:C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。商人阿龙来到C国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商.原创 2022-01-29 22:17:52 · 111 阅读 · 0 评论 -
动态规划 = =
1、01背包问题每个物品最多用一次2、完全背包问题3、多重背包问题4、分组背包问题每一组有若干个原创 2022-01-28 21:02:54 · 339 阅读 · 0 评论 -
拓扑排序题目
题目:用小于号"<"来定义两元素之间的关系,并于一个没有重复元素的有序上升序列 从小到大地排列这些元素。比如说,序列A,B,C,D意味着A<B;B<C;C<D。在这个问题里,我们会给你一组形如"A<B"的关系,询问你有序序列的合法性或其本身。输入输入有多组数据。每一组数据由其第一行的2个正整数n,m开始。第一个正整数n代表有n个元素需要排序(2<=n<=26),这些元素一定是按照字母表顺序,从第一个字母(A)开始的n个大写字母。第二个正整数m代原创 2022-01-28 10:25:13 · 1147 阅读 · 0 评论 -
Dijkstra算法——通过边实现松弛
引入:指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。一如既往,二维数组存图:但是,我们还需要一个一维数组dis来存储1号顶点到其余各个顶点的初试路程。如下:我们将此时dis数组中的值称为最短路程的“估计值”。既然是求1号顶点到其余各个顶点的最短路程,那就先找一个离1号顶点最近的顶点。通过数组dis可知当前离1号顶点最近的是2号顶点。当选择了2号顶点后,dis[2]的值就已经从“估计值”变为了“确原创 2022-01-27 22:40:37 · 1662 阅读 · 0 评论 -
FLoyd-Warshall算法
问题引入:求任意两个城市之间的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。(公路是单向的,就这么规定的)我们现在需要求两个城市之间的最短路径,也就是求任意两个点之间的最短路径。这个问题也被成为“多源最短路径”问题。二维数组存储图的信息:e[i][j]的值表示i点到j点的距离。图片如下。通过之前的学习,我们知道通过深度或广度优先搜索可以求出两点之间的最短路径。所以进行n^2遍深度或广度优先搜索,即对每两个点都进行一次深度或广度优先搜索,便可以求得..原创 2022-01-27 15:35:40 · 1093 阅读 · 0 评论 -
深搜(DFS)和宽搜(BFS)
相同点:深搜和宽搜都可以对空间进行遍历,搜索的结构都是树不同点:深搜(DFS):(直男)(执着的人)(1)尽可能往深了搜,当搜到叶节点(简称搜到头)就会回溯,然后再搜下一个,然后再回溯,然后再搜下一个,然后再回溯,再搜下一个......(边回去边看能不能往下走是不是真的无路可走了)。(2)用栈(stack)实现(3)搜的时候只需要记录这条路径上的所有点,因此使用的空间和高度是成正比的,越深存的越多宽搜(BFS):(海王)(稳重的人)(1)一层一层搜,可以同时看很多很多原创 2022-01-19 22:50:04 · 1805 阅读 · 6 评论 -
链表 = =
//head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;//初始化void init(){ head = -1; idx = 0;} //在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head = idx ++;} //将头节点删除,需要保证头节点存在void remove(){ head = n.原创 2022-01-15 15:21:07 · 185 阅读 · 0 评论 -
区间合并= =
模板://将所有存在交集的区间合并void merge(vector<PII> &segs){ vector<PII> res; sort(segs.begin(),segs.end()); int st = -2e9,ed = -2e9; for(auto seg : segs) { if(ed < seg.first) { if(st != -2e9) res.push_back({st,ed}); st = seg.原创 2022-01-15 14:54:44 · 138 阅读 · 0 评论 -
离散化 = =
模板:vector<int> alls; // 存储所有待离散化的值sort(alls.begin(),alls.end()); // 将所有值排序alls.erase(unique(alls.begin(),alls.end()),alls.end()); // 去掉重复元素// 二分求出x对应的离散化的值int find(int x) // 找到第一个大于等于x的位置 { int l = 0,r = alls.size() - 1; while(l < r) {原创 2022-01-15 14:35:23 · 90 阅读 · 0 评论 -
双指针算法
代码:int i,j,n;for(i = 0,j = 0;i < n;i ++){ while(j < i && check(i,j)) { j ++; }} 常见问题分类:(1)对于一个序列,用两个指针维护一段区间 (2)对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 ...原创 2022-01-14 11:52:08 · 127 阅读 · 0 评论 -
位运算算法
求n的第k位数字:n >> k & 1;返回n的最后一位1:lowbit(n) = n & - n;原创 2022-01-13 14:06:36 · 1438 阅读 · 0 评论 -
差分算法 = =
一维差分:给区间[l,r]中每个数加上c:B[l] += c,B[r + 1] -= c; 二维等分:给以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵中的所有元素加上c:S[x1,y1] += c; S[x2 + 1,y1] -= c; S[x1,y2 + 1] -= c; S[x2 + 1,y2 + 1] += c;...原创 2022-01-13 13:48:28 · 293 阅读 · 0 评论 -
前缀和 = =
一维前缀和:S[i] = a[1] + a[2] + ... + a[i]a[l] + ... + a[r] = S[r] - S[l - 1]二维前缀和:S[i,j] = 第i行第j列格子左上部分所有元素的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:S[x2,y2] - S[x1 - 1,y2] - S[x2,y1 - 1] + S[x1 - 1,y1 - 1]...原创 2022-01-13 13:39:13 · 210 阅读 · 0 评论 -
高精度模板
#include<bits/stdc++.h> using namespace std;//C = A + B,A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if(A.size() < B.size()) { return add(B,A); } vector<int> C; int i,t = 0; fo.原创 2022-01-13 11:30:17 · 93 阅读 · 0 评论 -
二分 = =
整数:#include<bits/stdc++.h> using namespace std;bool check(int x)//检查x是否满足某种性质 { ......}//区间[l,r]被划分成[l,mid]和[mid + 1,r]时使用 int bsearch(int l,int r){ while(l < r) { int mid = l + r >> 1; if(check(mid) == 1)//check()判断mid是否满原创 2022-01-13 11:21:22 · 222 阅读 · 0 评论 -
队列(啊哈算法)
普通代码:#include<bits/stdc++.h> using namespace std; int main(){ int q[102] = {0,6,3,1,7,5,8,9,2,4},head,tail; int i; head = 1; tail = 10; //队列中已经有9个元素了,tail指向队尾的最后一个位置 while(head < tail) { //打印队首并将队首出队 cout << q[head] &原创 2022-01-09 12:26:09 · 273 阅读 · 0 评论 -
基础算法之快速排序
代码:#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int a[N];void quick_sort(int q[],int l,int r){ int t; if(l >= r) { return; } int x = q[l],i = l - 1,j = r + 1; while(i < j) { do { i原创 2021-12-23 19:10:36 · 675 阅读 · 0 评论 -
基础算法之归并排序
给定你一个长度为 n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n个整数(所有整数均在 1∼10^9范围内),表示整个数列。输出格式输出共一行,包含 n个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5代码:#include<bits/stdc++.h&g原创 2021-12-23 17:43:49 · 702 阅读 · 0 评论 -
双指针扫描
来源:牛客网时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288K64bit IO Format: %lld题目描述给定长度为N的字符串S,要构造一个长度为N的字符串T。T初始是空字符串。S由大写字母构成。构造过程通过反复进行以下任意操作:从S的头部删除一个字符,添加到T的尾部从S的尾部删除一个字符,添加到T的尾部请你构造出字典序尽可能小的字符串T(字典序是指首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则比较第二个原创 2021-12-13 19:54:22 · 651 阅读 · 0 评论 -
枚举法= =
链接:登录—专业IT笔试面试备考平台_牛客网来源:牛客网题目描述2022年,2月22日2时22分22秒,小二突发奇想,他认为任何一个正整数都可以拆分成若干个不同的 2 的正整数次幂,请编程帮他验证这个想法。输入描述:输入文件只有一行,一个正整数 ????(1≤n≤231-1),代表需要判断的数。输出描述:如果这个正整数可以拆分成若干个不同的 2 的正整数次幂,从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。如果不存在这样的拆分,输出-1。示例1原创 2021-12-12 23:37:46 · 160 阅读 · 0 评论 -
取沙子= =
列一列数,找一找规律~原创 2021-12-12 17:04:35 · 1555 阅读 · 0 评论 -
曼哈顿距离
来了解一下曼哈顿距离~原创 2021-12-12 16:27:56 · 310 阅读 · 0 评论 -
高精度= =
再见了所有的EVA原创 2021-12-12 15:02:49 · 367 阅读 · 1 评论