摘要: 前缀和 可以利用前缀和解决用o(n)的时间复杂度求出一段序列的某一段区间的和。 一维前缀和 S[i] = a[1] + a[2] + ... a[i] a[l] + ... + a[r] = S[r] - S[l - 1] 例题 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l 阅读全文
posted @ 2020-07-15 16:52 kukudewen 阅读(181) 评论(0) 推荐(0)
摘要: 最短路问题总共可以用一张图来概括 阅读全文
posted @ 2020-05-24 12:12 kukudewen 阅读(162) 评论(0) 推荐(0)
摘要: 树与图的存储 树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b, b->a。因此我们可以只考虑有向图的存储。 (1) 邻接矩阵:g[a][b] 存储边a->b (2) 邻接表: // 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点 阅读全文
posted @ 2020-05-24 11:52 kukudewen 阅读(449) 评论(0) 推荐(3)
摘要: 并查集: 1.将两个集合合并。 2.询问两个元素是否在一个集合当中。 基本原理:每个集合用一颗树来表示。树根的编号就是整个集合的编号。每个节点存储他的父亲节点,p[x]表示x的父亲节点。 问题1:如何判断树根:if(p[x]==x); 问题2:如何求x的集合的编号:while(p[x]!=x) x= 阅读全文
posted @ 2020-05-17 15:30 kukudewen 阅读(254) 评论(0) 推荐(0)
摘要: 用数组模拟栈 // tt表示栈顶 int stk[N], tt = 0; // 向栈顶插入一个数 stk[ ++ tt] = x; // 从栈顶弹出一个数 tt -- ; // 栈顶的值 stk[tt]; // 判断栈是否为空 if (tt > 0) { } 用数组模拟队列 // hh 表示队头,t 阅读全文
posted @ 2020-05-13 15:11 kukudewen 阅读(258) 评论(0) 推荐(0)
摘要: 高精度加法:计算A+B #include<bits/stdc++.h> using namespace std; vector<int> add(vector<int> &A,vector<int> &B) { if (A.size() < B.size()) return add(B, A); v 阅读全文
posted @ 2020-05-13 12:19 kukudewen 阅读(147) 评论(0) 推荐(0)
摘要: 快速排序——分治 1.确定分界点:q[l+r>>1] 2调整区间; 保证做区间的数满足<=x,右区间的数据.>=x。 3.递归处理左右两段。 void quick_sort(int q[],int l,int r) { if(l>=r) return; int i=l-1; int j=r+1; i 阅读全文
posted @ 2020-05-02 20:30 kukudewen 阅读(289) 评论(0) 推荐(0)
摘要: Vector是什么? vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象, 简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了可以使用 阅读全文
posted @ 2020-04-26 20:02 kukudewen 阅读(231) 评论(0) 推荐(0)
摘要: 快速幂 假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b),即是O(n)级别。但快速幂能做到O(logn)的复杂度。 1.&运算:通常用于二进制取位操作,例如一个数x,x&1的结果就是取x的二进制的最末位的数。还可以判断这个数的奇偶性,如果x&1==0,则认为x为偶数,如 阅读全文
posted @ 2020-04-26 14:13 kukudewen 阅读(205) 评论(0) 推荐(0)