Acwing
qq_41699013
这个作者很懒,什么都没留下…
展开
-
关于二分边界问题的总结
对于搜索过程中, high 位置的作用是减少搜索空间而 low 的作用是从0开始一直向着目标数字前进搜索到的时候返回它,是一个一直逼近的过程。所以结论是,返回左边界,即l。先这样吧,有别的再补充...原创 2021-12-04 20:49:26 · 103 阅读 · 0 评论 -
算法基础课:八数码
别的题解y总思路的题解原创 2021-09-22 22:10:00 · 84 阅读 · 0 评论 -
算法基础课:走迷宫
#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;const int N = 110;typedef pair<int, int> PII;int d[N][N];int n, m;int g[N][N];int bfs(){ int原创 2021-09-21 20:12:49 · 65 阅读 · 0 评论 -
算法基础课:合并集合
#include<iostream>using namespace std;const int N = 1e5 + 10;int s[N], p[N];int find(int x){ if (p[x] != x) p[x] = find(p[x]); return p[x];}void merge(int a, int b){ int x = find(a), y = find(b); p[x] = y;}void query(int a,原创 2021-09-20 15:55:10 · 82 阅读 · 0 评论 -
算法基础课:最大异或对
1.暴力做法for i: 1-nfor j: i-n异或,取最大值。2.如何优化从高到低,依次找0(遍地飘零)原创 2021-09-20 15:33:04 · 76 阅读 · 0 评论 -
算法基础课:滑动窗口
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e6 + 10;int a[N], q[N];//q[N]维护的是数组下标。对应的a[q[i]]应当随着i的增加而增加/减少int main(){ int n, k; cin >> n >> k; int hh = 0, tt原创 2021-09-19 19:27:03 · 86 阅读 · 0 评论 -
算法基础课:模拟队列
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100010;int q[N];int hh, tt;void init(){ hh = 0, tt = -1;}int main(){ int m; cin >> m; init(); string op;原创 2021-09-19 16:38:27 · 65 阅读 · 0 评论 -
表达式求值
给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/(1−4)=原创 2021-09-19 16:14:56 · 71 阅读 · 0 评论 -
算法基础课:模拟栈
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100010;int stk[N], tt;int main(){ int m; cin >> m; string op; int x; while (m -- ) { cin >>原创 2021-09-18 22:09:28 · 57 阅读 · 0 评论 -
算法基础课:双链表
双链表在k左边插入时,add(l[k], x)即可原创 2021-09-18 21:55:30 · 48 阅读 · 0 评论 -
算法基础课:连通块中点的数量
连通块中点的数量思路size[N]: 连通块的大小,只有祖先节点有意义p[N]: 并查集,初始值就是它自己。merge(int a, int b): 让a所在的集合并入到b所在的集合,b的祖先size值加上a的祖先size注意C情况下,a和b是可能相等的,需要加入判断暂时需要解释的就这些,其他的有问题再说吧代码#include<bits/stdc++.h>using namespace std;const int N = 100010;int p[N], si[N],原创 2021-09-13 22:54:29 · 78 阅读 · 0 评论 -
算法基础课:Trie树
Trie: 高效存储和查找字符串链表,Trie,堆关系存储从前往后遍历字符每个单词的最后打上标记,以知晓该点是否有单词查找原创 2021-09-11 17:36:09 · 47 阅读 · 0 评论 -
双指针算法
双指针核心思想:将O(N^2)的朴素算法优化到 O(N)两个序列例:归并一个序列例:快排//模板for(i = 0; j = 0; i < n; i++){ while (j < i && check(i, j)) j++;}简单应用将单词转化成单独占有一行例:abc def ghi=>abcdefghi题目:最长连续不重复子序列给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式第一行原创 2021-09-03 20:39:52 · 49 阅读 · 0 评论 -
算法基础课:位运算
n的二进制表示中第k位是几n >> k看个位是几 x &1原创 2021-09-03 20:38:57 · 31 阅读 · 0 评论 -
前缀和与差分
输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整数数列。接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。输出格式共 m 行,每行输出一个询问的结果。数据范围1≤l≤r≤n,1≤n,m≤100000,−1000≤数列中元素的值≤1000输入样例:5 32 1 3 6 41 21原创 2021-09-03 15:20:36 · 67 阅读 · 0 评论 -
算法基础课:KMP算法
暴力算法S[N]——长数组, p[M]——短数组for(int i = 1; i <= n;i ++){ bool flag = true; for (int j = 1; j <= m; j ++) if (s[i] != p[j] { flag = false; break; }} next[i]:以i为终点的后缀与以1为起点的前缀的最长相同长度next[i] = j :p[1~j] = p[i - j + 1, i] //next[i]计算过原创 2021-08-27 14:46:02 · 74 阅读 · 0 评论 -
算法基础课:哈希表
存储结构:开放寻址法添加:从第k个开始,找到第一个非空(坑位)查找:从第k个开始,如果当前坑位有人且不是x,看下一个坑位;若没有人,说明x不存在删除:做一个特殊标记#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 100003;int h[N], e[N], ne[N], idx;string op;int n,原创 2021-08-27 09:43:59 · 66 阅读 · 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 句话有的是真的,有的是假的。当一句话满足下列三条之原创 2021-08-25 17:12:41 · 817 阅读 · 0 评论 -
算法基础课:图论
最短路:单源最短路:从1号点到n号点①所有边权都是正数:朴素Dijkstra(O(n^2))、堆优化Dijkstra(O(mlogn))②存在负权边Bellman-Ford O(nm)SPFA O(m) 最坏O(nm)多源汇(起点、终点)最短路Floyd O(n^3)m和n^2一个级别 稠密图m和n一个级别 稀疏图结构图如下:难点:建图朴素Dijkstra集合s:已经确定了最短距离的点① dis[1] = 0, dis[i] = +inf;②for i : 0 ~ nt ←不在原创 2021-08-25 15:57:34 · 102 阅读 · 0 评论 -
算法基础课:单链表
实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数;删除第 k 个插入的数后面的数;在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。输入格式第一行包含整数 M,表示操作次数。接下来 M 行,每行包含一个操作命令,操作命令可能原创 2021-08-16 11:05:41 · 97 阅读 · 0 评论 -
算法基础课:台阶NIm
现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 ai 个石子(i≥1)。两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数 n。第二行包含 n 个整数,其中第 i 个整数表示第 i 级台阶上的石子数 ai。输出格式如果先手方必胜,则输出 Yes。否则,输出 No。数据范围1≤n≤105,1≤a原创 2021-08-13 15:47:03 · 98 阅读 · 0 评论 -
算法基础课:最短编辑距离
图源jasonlin, acwing账号以下是他的代码#include <iostream>#include <string>#include <vector>using namespace std;int leastEdit(string a, string b){ int m = a.size(), n = b.size(); vector<vector<int>> dp(m+1, vector<in..原创 2021-08-06 18:39:25 · 62 阅读 · 0 评论 -
算法基础课:高精度
大整数存储放到一个数组中,每个单元存一位,逆序存储高精度加法原创 2021-07-20 13:07:27 · 63 阅读 · 0 评论 -
算法基础课:数的三次方根
浮点数的二分题目给定一个浮点数 n,求它的三次方根。输入格式共一行,包含一个浮点数 n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留 6 位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000分析用二分的方法做即可。代码#include<iostream>#include<iomanip>using namespace std;double n, l, r, x;int main(原创 2021-07-14 16:03:56 · 184 阅读 · 0 评论 -
算法基础篇:数的范围
二分的本质:寻找含有某种性质的区间边界有单调性的序列一定可以二分模板1 check红色部分(左边)mid = l + r >>1;if (check(mid)) [mid, r]; l = mid;else [l, mid - 1]; r = mid - 1;模板2 check绿色部分(右边)mid = l + r +1 >>1;if (check(mid)) [l, mid]; r = mid;else [mid + 1, r]; l = mid + 1;题目原创 2021-07-14 15:37:29 · 196 阅读 · 0 评论 -
算法基础篇:归并排序
题目: 给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围: 1≤n≤100000输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5归并排序:将两个有序数列合二为一。原理:1.确定分界点mid = (l + r) / 22.递归.原创 2021-07-12 20:10:41 · 150 阅读 · 0 评论 -
算法基础篇:第k个数
题目:给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式:第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出格式:输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000, 1≤k≤n输入样例: 5 3 2 4 1 5 3输出样例: 3就是一个快排的简单应用,一遍过,感觉自己又行了边界问题:递归过程中,能不能换成以i为边界?答:可以。其他相关问题.原创 2021-07-12 18:24:40 · 126 阅读 · 0 评论 -
算法基础篇: 快速排序
从零开始的Acwing生活——算法基础篇第一讲 基础算法快速排序题目:请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式 输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式: 输出共一行,包含 n 个整数,表示排好序的数列。数据范围 1≤n≤100000 >输入样例: 5 3 1 2 4 5输出样例: 1 2 3 4 5原理:分治思想选择一个中轴数,将所有小于中轴数的数放在原创 2021-07-12 17:55:18 · 112 阅读 · 0 评论