自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

青丝蛊のblog

枯燥乏味~

  • 博客(26)
  • 收藏
  • 关注

原创 动态规划dp

DP优化,一般是对代码或方程进行等价变形背包问题01背包问题描述每件物品只能选一次,使这些物品的总体积不超过背包容量,且总价值最大。分析f(i, j), 分成两个子集:即 f(i,j)=max(f(i−1,j),f(i−1,j−vi)+wi)f(i,j)=max(f(i-1,j), f(i-1,j-v_i)+w_i)f(i,j)=max(f(i−1,j),f(i−1,j−vi​)+wi​)代码实现#include <iostream>using namespace std

2021-10-07 15:01:13 122

原创 关于位运算的操作

n的二进制的第k位n >> k & 1n的二进制的最后一位1的位置 lowbitlowbit 的应用给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入样例:51 2 3 4 5输出样例:1 1 2 1 2#include <iostream>using namespace std;int lowbit(int x){ return x & -x; // 最后一个1所在位置的值}int mai

2021-03-19 19:40:33 112

原创 二分图——模板

二分图二分图当且仅当图中不含奇数环染色法判断一个图是不是二分图。分析由于图中不含奇数环,所以染色过程中一定没有矛盾,如果矛盾,则有奇数环,就不是二分图。代码实现复杂度:O(n+m)O(n+m)O(n+m)#include <iostream>#include <vector>using namespace std;const int N = 100010;int n, m;vector<int> path[N];int color[

2021-02-23 18:05:59 112

原创 最小生成树——模板

Prim朴素#include <iostream>#include <cstring>#include <vector>#include <queue>using namespace std;typedef pair<int, int> PII;const int N = 510, INF = 0x3f3f3f3f;int n, m;int path[N][N], dis[N]; // dis:每个节点距离生成树的距离bo

2021-02-23 16:11:03 69

原创 最短路算法——模板

单源最短路权值都为正数Dijkstra (迪杰斯特拉)朴素复杂度:O(n2)O(n^2)O(n2)堆优化复杂度:O(mlogn)O(mlogn)O(mlogn)权值都为负数Bellman-Ford复杂度:O(nm)O(nm)O(nm)Bellman-Ford复杂度:一般:O(m)O(m)O(m),最坏O(nm)O(nm)O(nm)多源最短路Floyd复杂度:O(n3)O(n^3)O(n3)...

2021-02-21 18:18:41 136

原创 拓扑序列——模板

拓扑排序只适用于 AOV网 (有向无环图)问题描述给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。输入格式第一行包含两个整数n和m接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边(x, y)。输出格式共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。

2021-02-20 16:35:59 230

原创 模拟堆——模板

关于堆的操作:插入一个数:heap[++ size] = x; up(size);求集合当中的最小值:heap[1]删除最小值:heap[1] = heap[size]; size--; down(1);删除任意一个元素(stl 实现不了):heap[k] = heap[size]; size--; down(k); up(k);修改任意一个元素 (stl 实现不了):heap[k] = x; down(k); up(k);堆满足完全二叉树(除最后一层)...

2021-02-15 16:32:08 63

原创 并查集——模板

并查集:将两个集合合并询问两个元素是否在一个集合中基本原理:每个集合用一颗树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示 x 的父节点。问题:如何判断树根:if(p[x]==x)如何求 x 的集合编号:while(p[x]!=x) x=p[x]如何合并两个集合:px 是 x 的集合编号,py 是 y 的集合编号,p[x]=y(1)朴素并查集:int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点+路径压缩int find(int

2021-02-15 15:33:43 63

原创 Trie字符串树——模板

问题描述“I x”向集合中插入一个字符串x;“Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过 1050^505,字符串仅包含小写英文字母。代码实现#include <iostream>using namespace std;const int N = 100010;// 0号点既是根节点,又是空节点// son[][]存储树中每个节点的子节点// cnt[]存储以每个节点结尾的单词数量int son[N][26], cnt[N].

2021-02-02 16:31:13 92

原创 N皇后问题

问题描述:给定一个 N×NN×NN×N 的棋盘,请你在上面放置 NNN 个棋子,要求满足:每行每列都恰好有一个棋子每条对角线上都最多只能有一个棋子 1 2 3 4 5 6 -------------------------1 | | O | | | | | -------------------------2 | | | | O | | | -------------------------3 | | |

2021-01-31 16:20:30 58

原创 由数据范围反推算法复杂度以及算法内容

一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在 10710^7107∼10810^8108为最佳。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:n ≤ 30, 指数级别, dfs+剪枝,状态压缩dpn ≤100 => O(n3)O(n^3)O(n3),floyd,dp,高斯消元n ≤ 1000 => O(n2)O(n^2)O(n2),O(n2logn)O(n^2logn)O(n2logn),dp,二分,朴素版Dijkstra、朴素

2021-01-31 13:46:22 65

原创 进制转换——模板

代码实现:char get(int n){ if(n < 10) return n + '0'; return n - 10 + 'A';}/* n:要转进制的数字,b:b进制 */string base(int n,int b){ string num; while(n) num += get(n % b),n /= b; reverse(num.begin(),num.end()); return num;}...

2021-01-30 21:46:23 64

原创 单调队列——模板

常见模型:找出滑动窗口中的最大值/最小值问题描述给定一个大小为 n≤106n≤10^6n≤106 的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。窗口位置最小值最大值[1 3 -1] -3 5 3 6 7-131 [3 -1 -3] 5 3 6 7-331 3 [-1 -3 5] 3 6 7-35

2021-01-30 21:45:40 82

原创 高精度运算——模板

高精度加法/* 由于便于相加进位,把读入的string A,B reverse后传参,这里A>=0和B>=0 */vector<int> add(string &A, string &B){ vector<int> C; int t = 0; // t:进位 for(int i = 0;i < A.size()||i < B.size(); i++) { if(i < A.size()

2021-01-30 21:44:33 86

原创 双指针算法——模板

分割单词:输入一串由空格间隔的字符串,让每个单词各占一行输出string s;getline(cin, s);for (int i = 0; i < s.size(); i++){ if(s[i]==' ') continue; // 由于空格不止一个,让指针指向单词开头 int j = i; // j寻找单词的结束位置 while (j < s.size() && s[j] != ' ') j++; for (int k = i

2021-01-30 21:43:58 319

原创 单调栈——模板

问题描述给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤N≤10^51≤N≤1051≤数列中元素≤1091≤数列中元素≤10^91≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2暴力,从每个数的前一个开始找

2021-01-26 17:52:45 148

原创 模拟栈——模板

问题描述实现一个栈,栈初始为空,支持四种操作:“push x” – 向栈顶插入一个数x;“pop” – 从栈顶弹出一个数;“empty” – 判断栈是否为空;“query” – 查询栈顶元素。现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。输出格式对于每个”empty”和”query”操作都要输出一个查询结果,

2021-01-26 16:08:29 57

原创 区间合并——模板

问题描述给定 n 个区间 [li,ri][li,ri][li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3][1,3][1,3]和[2,6][2,6][2,6]可以合并为一个区间[1,6][1,6][1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。输入样例:51 22 45 67 87 9输出样例:3先根据左

2021-01-24 12:19:36 88

原创 离散化——模板

离散化——当数据范围很大,仅用到其中几个数值的话,将其映射成下标。模板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

2021-01-20 20:10:05 61

原创 抽屉原理——分治、二分

抽屉原理n+1 个苹果放在 n 个抽屉里,那么至少有一个抽屉中会放两个苹果。不修改数组找出重复的数字给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。请找出数组中任意一个重复的数,但不能修改输入的数组。样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]返回 2 或 3。然后我们采用分治的思想,将每个数的取值的区间[1, n]划分成[1, n/2]和[n/2+1, n]两个子区间,然后分别统计两个区间中数的个数。注意这里

2021-01-20 13:31:31 213

原创 排序——模板

快速排序模板:void quick_sort(int l, int r){ if(l >= r) return ; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { while(q[++i] < x); while(q[--j] > x); if(i < j) swap(q[i], q[j]);

2021-01-17 14:42:41 820

原创 前缀和——模板

一维前缀和 int n, m, q[N], s[N]; cin >> n >> m; for(int i = 1; i <= n; i++) /* 前缀和初始化从下标1开始 */ { scanf("%d", &q[i]); s[i] = s[i - 1] + q[i]; } while(m--) { int l,r; cin >> l

2021-01-16 23:07:02 110

原创 差分——模板

差分:前缀和的逆运算。一维差分引入问题:输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入样例:6 31 2 2 1 2 11 3 13 5 11 6 1输出样例:3 4 5 3 4 2思考:每次要想在序列的[l,r]区间内的数都加上c,都要从l到r循环相加,每次复杂度O(n)O(n)O(n),最后完成需要O(mn)O(mn)O(mn).引入差分,可以让每

2021-01-16 18:44:48 146

原创 蛇形矩阵——经典例题

问题描述:输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。输入样例:3 3输出样例:1 2 38 9 47 6 5代码实现1:#include <iostream>using namespace std;const int N = 110;int n, m, q[N][N];int main(){ cin >> n >> m; int ans = 1, i = 0, j

2021-01-13 22:40:44 198

原创 二分——模板

算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1,计算mid时不需要加1。int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = m

2021-01-13 22:40:09 36

原创 二叉树

二叉树的相关操作前言一、pandas是什么?二、二叉树的操作1.静态链表方式(1)建树:(2)遍历(3)求树的高度2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、二叉树的操作1.静态链表方式(1.

2020-12-20 18:45:47 155

空空如也

空空如也

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

TA关注的人

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