算法
AC-PEACE
这个作者很懒,什么都没留下…
展开
-
归并排序解决逆序对的数量问题
将序列从中间分开,将逆序对分成三类:两个元素都在左边;两个元素都在右边;两个元素一个在左一个在右;原创 2022-07-18 12:04:11 · 97 阅读 · 0 评论 -
归并排序思路及例题
//第一步:找到分界点,分成子问题 int mid = l + r >> 1; //第二步:递归处理子问题 merge_sort(q, l, mid); merge_sort(q, mid + 1, r); //第三步:*合并子问题*原创 2022-07-17 15:54:43 · 121 阅读 · 0 评论 -
快速排序·例题二
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。原创 2022-07-13 12:27:24 · 371 阅读 · 0 评论 -
快速排序例题
快排属于分治算法,分治算法一般分为三步:1. 分成子问题2. 递归处理子问题3. 子问题合并原创 2022-07-13 12:12:12 · 764 阅读 · 0 评论 -
DFS 之 全排列
题目描述给定一个整数 n,将数字 1 ∼ n 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数 n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围: 1 ≤ n ≤ 7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1https://www.acwing.com/problem/content/844/思路:dfs深度优先遍历的思想比较简.原创 2022-03-31 21:26:45 · 1423 阅读 · 0 评论 -
哈希表【数组模拟散列表】(开放寻址法和拉链法)
例题描述:维护一个集合,支持如下几种操作:I x,插入一个数x; Q x,询问数x是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。输出格式对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。每个结果占一行。数据范围: 1 ≤ N ≤ 1051 −10^9 ≤...原创 2022-03-28 22:41:53 · 151 阅读 · 0 评论 -
堆排序(用数组模拟小根堆)
输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。输入格式第一行包含整数 n 和 m。第二行包含 n 个整数,表示整数数列。输出格式共一行,包含 m 个整数,表示整数数列中前 m 小的数。数据范围1 ≤ m ≤ n ≤ 1051,1 ≤ 数列中元素 ≤ 1091输入样例:5 34 5 1 3 2输出样例:1 2 3原题链接:https://www.acwing.com/problem/content/840/#include<.原创 2022-03-26 23:28:23 · 1806 阅读 · 0 评论 -
并查集维护树的深度(即每个点到根节点的距离)
题目:食物链描述:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以 1 ∼ N编号。每个动物都是A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是1 X Y,表示X和Y是同类。第二种说法是2 X Y,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,...原创 2022-03-26 13:57:59 · 255 阅读 · 0 评论 -
连通块中 点的数量
题目描述:给定一个包含n 个点(编号为1∼n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种:C a b,在点aa和点bb之间连一条边,a和b可能相等; Q1 a b,询问点a和点b是否在同一个连通块中,a和b可能相等; Q2 a,询问点a所在连通块中点的数量;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为C a b,Q1 a b或Q2 a中的一种。输出格式对于每个询问指令Q1...原创 2022-03-24 23:11:23 · 381 阅读 · 1 评论 -
并查集之合并集合
题目描述:一共有 n个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m个操作,操作共有两种:M a b,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; Q a b,询问编号为a和bb的两个数是否在同一个集合中;输入格式第一行输入整数 n 和 m。接下来m行,每行包含一个操作指令,指令为M a b或Q a b中的一种。输出格式对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b ...原创 2022-03-24 13:29:00 · 71 阅读 · 0 评论 -
二阶差分(注意数据范围)
题目描述小明在练习绝世武功,nn个练功桩排成一排,一开始每个桩的损伤为00。接下来小明会练习mm种绝世武功,每种武功都会对[l, r][l,r]区间分别造成[s,e][s,e]的伤害。这个伤害是一个等差序列。例如l = 1, r = 4, s = 2, e = 8l=1,r=4,s=2,e=8,则会对1-41−4号练功桩造成2, 4, 6, 82,4,6,8点损伤。小明想让你统计一下所有练功桩的损伤的和。输入描述第一行输入n, mn,m,代表练功桩的数量...原创 2022-03-22 22:04:30 · 3089 阅读 · 0 评论 -
Trie字符串插入与统计
原题链接:https://www.acwing.com/problem/content/837/#include<iostream>using namespace std;const int N = 100010;int son[N][26], cnt[N], idx = 0;//作用分别为:存子节点、存节点数、开辟即将用到的的新节点char str[N];void insert(char str[])//不需要返回数值,函数类型定义为void{ int p...原创 2022-03-22 14:49:45 · 478 阅读 · 0 评论 -
滑动窗口
原题链接:https://www.acwing.com/problem/content/156/#include<iostream>using namespace std;const int N = 1000010;int a[N], q[N];//q存的是下标int main(){ int n, k; scanf("%d%d", &n, &k); for(int i = 0; i < n; i ++) sca...原创 2022-03-20 19:52:54 · 54 阅读 · 0 评论 -
用数组模拟栈
原题链接:https://www.acwing.com/problem/content/830/#include<iostream>using namespace std;const int N = 100010;int q[N], tt;int main(){ int m; scanf("%d", &m); while(m --) { string a; int x; ...原创 2022-03-17 23:03:22 · 50 阅读 · 0 评论 -
单调栈(包括栈顶是头和尾两种情况)
题目给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。输入格式第一行包含整数 N,表示数列长度。第二行包含 N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2原题链接:https://www.acwing.co.原创 2022-03-17 22:55:45 · 86 阅读 · 0 评论 -
双链表(用数组模拟)
实现一个双链表,双链表初始为空,支持55种操作:在最左侧插入一个数; 在最右侧插入一个数; 将第k个插入的数删除; 在第k个插入的数左侧插入一个数; 在第k个插入的数右侧插入一个数现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第kk个插入的数并不是指当前链表的第kk个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式...原创 2022-03-15 19:22:34 · 131 阅读 · 0 评论 -
单链表(数组模拟)
https://www.acwing.com/problem/content/828/#include <iostream>using namespace std;const int N = 100010;// head 表示头结点的下标// e[i] 表示节点i的值// ne[i] 表示节点i的next指针是多少// idx 存储当前已经用到了哪个点int head, e[N], ne[N], idx;// 初始化void init(){ he...原创 2022-03-14 22:30:59 · 560 阅读 · 0 评论 -
在单调序列中求数的范围(二分法)
链接:https://www.acwing.com/problem/content/791/#include<iostream>using namespace std;const int N = 100010;int n, m, k;int q[N];int main(){ scanf("%d%d", &n, &m); for(int i = 0; i < n; i ++) scanf("%d", &q[i...原创 2022-03-06 16:00:38 · 46 阅读 · 0 评论 -
二进制中1的个数(lowbit算法与暴力枚举)
原题链接:https://www.acwing.com/problem/content/803/算法一:lobit(lowbit) O(nlogn)O(nlogn)使用lowbit操作,进行,每次lowbit操作截去一个二进制数字 x 最后一个1后面的所有位,每次减去lowbit得到的数字,直到数字 x 减到0,就得到了其二进制形式中的1的个数,lowbit原理根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一...原创 2022-03-05 10:41:15 · 301 阅读 · 0 评论 -
判断子序列(双指针算法)
原题链接:https://www.acwing.com/problem/content/2818/#include<iostream>using namespace std;const int N = 1e5 + 10;int n, m;int a[N], b[N];int main(){ scanf("%d%d", &n, &m); for(int i = 0; i < n; i ++ ) scanf("%d", .原创 2022-03-02 21:39:07 · 48 阅读 · 0 评论 -
数组元素的目标和(双指针算法)
题目链接:https://www.acwing.com/problem/content/802/#include<iostream>using namespace std;const int N = 100010;int a[N], b[N];int n, m, x;int main(){ scanf("%d%d%d", &n, &m, &x); for(int i = 0; i < n; i ++ ) scanf..原创 2022-03-02 21:01:19 · 43 阅读 · 0 评论 -
最长连续不重复子序列(双指针算法)
原题连接:https://www.acwing.com/problem/content/801/#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N], s[N];int n = 0,r = 0;int main(){ cin >> n; for(int i = 0, j = 0; i < n; i ++ ) { c...原创 2022-03-01 23:33:43 · 277 阅读 · 0 评论 -
差 分 矩 阵
原题连接:https://www.acwing.com/problem/content/800/可参考子矩阵的和进行辅助理解:https://blog.csdn.net/weixin_62971133/article/details/123146409?spm=1001.2014.3001.5501#include<iostream>using namespace std;const int N = 1010;int a[N][N], b[N][N];int n, m...原创 2022-02-28 18:46:31 · 130 阅读 · 0 评论 -
差分(降低时间复杂度)
https://www.acwing.com/problem/content/799/#include<iostream>using namespace std;const int N = 100010;int n, m;int a[N], b[N];int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++ ) { scan...原创 2022-02-28 12:49:24 · 210 阅读 · 0 评论 -
子矩阵的和(前缀和的二维版)
https://www.acwing.com/problem/content/798/#include<iostream>using namespace std;const int N = 1010;int a[N][N], s[N][N];int m, n, q;int main(){ scanf("%d%d%d", &m, &n, &q); for(int i = 1; i <= m; i++)原创 2022-02-26 10:57:48 · 113 阅读 · 0 评论 -
前缀和总结
https://www.acwing.com/problem/content/797/#include<iostream>using namespace std;const int N = 100010;int q[N], s[N];int main(){ int m, n; cin >> m >> n; for(int i = 1; i <= m; i++) scanf("%d", &...原创 2022-02-25 22:00:33 · 393 阅读 · 0 评论 -
高精度除法(高除以低)
https://www.acwing.com/problem/content/796/#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;//核心代码段 A / bvector<int>div(vector<int> &A, int b, int &r)// r ...原创 2022-02-25 11:40:14 · 98 阅读 · 0 评论 -
高精度乘法
一、高 乘 低https://www.acwing.com/problem/content/795/#include<iostream>#include<vector>using namespace std;vector<int>mul(vector<int>&a, int b){ vector<int>c; //int t = 0;也可以等效写在for循环的括号里。 for(int.转载 2022-02-21 20:57:12 · 68 阅读 · 0 评论 -
高精度减法
#include<iostream>#include<vector>using namespace std;bool cmp(vector<int>a,vector<int>b){ if ( a.size() != b.size() ) return a.size() > b.size(); for( int i=a.size()-1 ; i>=0 ; i-- ) { if(a[i]!=b[...原创 2022-02-21 14:08:07 · 359 阅读 · 0 评论 -
高精度加法
https://www.acwing.com/problem/content/793/#include<iostream>#include<string>#include<vector>using namespace std;vector<int>sum(vector<int>a, vector<int>b){ vector<int>result; int t = 0;//进...原创 2022-02-21 13:56:51 · 292 阅读 · 0 评论 -
爬楼梯问题(动态规划)
动态规划原创 2022-01-12 21:18:59 · 491 阅读 · 0 评论