
基础算法
编程语言只是编程的工具,算法才是程序的灵魂,该专栏记录整合的ACwing学习记录。
DearLife丶
“翻滚的时代浪潮中,曾有多少灵魂抗争”
展开
-
区间合并
将几个有交集的区间进行合并思路:①按区间左端点排序;②扫描区间,有三种情况:全包含,有交集,无交集例题#include <iostream>#include <vector>#include <algorithm>using namespace std;typedef pair<int,int> PII;vector<PII> segs;int n;//合并void merge(vector<PII原创 2021-01-11 11:54:01 · 193 阅读 · 0 评论 -
离散化及应用
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗地说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。数据个数上限:10^5 每个数据值域:0~10^9;值域很大,但用到的数没那么多,相对稀疏,此时考虑用离散化。将数据依次映射到从0开始的自然数上。例如:原数据:a[ ] :1,3,100,2000,500000;(有序)映射到:0,1,2,3,4; (保序离散化,小的在前,大的在后,其实就是把a中的值映射到下标)这个过程就叫做离散化..原创 2021-01-08 20:39:41 · 292 阅读 · 0 评论 -
位运算
典型应用1:n的二进制表示中第k位是几注:二进制表示中,第几位是从后向前看的(从后向前依次为第0,1,2...k...n位)①先把第k位移到最后一位 n>>k②看最后一位是几 x&1→ n>>k&1典型应用2:lowbit操作(树状数组基本操作)lowbit(x):返回x的最后一位1(最右边的1)例如:x = 1010 lowbit(x)=10;x = 101000 lowbit(x)=1000即lowbi...原创 2021-01-08 14:23:00 · 208 阅读 · 0 评论 -
双指针算法
常见分类一、两个指针指向两个序列对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作例如:归并排序二、两个指针指向一个序列对于一个序列,用两个指针维护一段区间例如:快速排序通用模板for(i = 0,j = 0; i < n; i ++ ){ while(j < i && check(i,j) j ++ ; //j在合法的范围并且满足某种性质 //每道题目的具体逻辑}核心思想f...原创 2021-01-08 13:23:16 · 225 阅读 · 0 评论 -
差分(前缀和的逆运算)
一维给定数组a[N]: a1,a2......an;构造数组b[N]使得 ai = b1 + b2 + ... + bi;即数组a是数组b的前缀和b称为a的差分,a称为b的前缀和前缀和与差分互为逆运算构造方法:(了解)b1 = a1;b2 = a2 - a1;b3 = a3 - a2;... ...bn = an - a(n-1).作用(重点)将数组a中任意区间 [ L , R ] 中的所有元素全部加一个常数C , 可转化为 b[L] + C,b..原创 2021-01-07 16:07:19 · 333 阅读 · 0 评论 -
前缀和
一维前缀和给定数组 a[N] : a[1],a[2],a[3]......a[n];前缀和公式: S[i] = a[1]+a[2]+ ... +a[i]a[l]+ ... +a[r] = S[r] - S[l - 1]作用:求一个数组任意区间元素的和注:前缀和数组下标往往从1开始,并令S[0] = 0. 方便计算例如 S[10] - S[0] = a[1] + a[2] + ... +a[10] 这样的前缀和。例题#include <iostream>..原创 2021-01-07 11:40:52 · 254 阅读 · 0 评论 -
高精度(二)——乘除法
高精度——乘法(大数乘小数)#include <iostream>#include <vector>using namespace std;vector<int> mul(vector<int> &A,int b){ vector<int> C; int t = 0; for(int i = 0;i < A.size() || t;i ++ ) { if(i <原创 2021-01-06 18:35:53 · 148 阅读 · 0 评论 -
高精度(一)——加减法
(一)高精度加法#include <iostream>#include <vector>using namespace std;//const int N = 1e6 + 10;//C = A + Bvector<int> add(vector<int> &A, vector<int> &B){ vector<int> C; int t = 0; //进位 for(i原创 2021-01-06 13:01:22 · 715 阅读 · 0 评论 -
归并排序.
归并:利用双指针算法,两个指针分别指向两个有序序列的起点(最小值),另开辟一个新的数组来存储最终结果,比较两个序列哪个更小,将较小的值放入新数组中,指针后移,最终即可得到归并后的序列。归并排序算法是稳定的,即原序列两个数的值相同,排序后他们位置不发生变化。注:如果两个序列的值相等,一般将第一个序列的值先放入结果数组中。1.确定分界点(下标的中间值):mid=(l+r)/2。3.归并,合二为一(把两个有序的序列合并为一个)时间复杂度:O(nlogn)2.递归排序左右两边。原创 2021-01-05 14:17:58 · 233 阅读 · 0 评论 -
快速排序.
#include <iostream>using namespace std;const int N = 100010;int n;int q[N];void quick_sort(int q[],int l,int r){ if(l>=r) return; int i=l-1,j=r+1; int x=q[(l+r)/2]; while(i<j) { do i++; while(q[i]<...原创 2021-01-05 14:15:38 · 600 阅读 · 0 评论 -
二分
↵二分——整数二分模板题:ACwing 789#include <iostream>using namespace std;const int N = 100010;int n,m;int q[N];int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&q[i]); while(m--) { ..原创 2021-01-05 11:15:07 · 161 阅读 · 0 评论