
寒假集训
飞机大人
此人很lan,甚么都没有写
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法日记--十三日日记
今日内容–博弈论1、巴什博奕例题:一堆石子,给定石子数量n,和每次最多能取出的石子数量m。有结论:如果满足n % (m + 1) != 0,则先手必胜,否则先手必败。例题: [HDU-1846] [HDU-1847]2、尼姆博弈有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。以三元组为例,(a,b,c)。如果a ^ b ^ c != 0 即为必胜态。如果a ^ b ^ c == 0 即为必败态。我们将必败态时的(a, b, c)成为奇原创 2021-02-20 20:18:25 · 102 阅读 · 0 评论 -
算法日记--十二日日记
今日内容–数论素数筛:1、埃氏筛(时间复杂度O(nloglogn)):const int maxn = 100;bool number[maxn + 5];void isprime() { int i, j; memset(number, true, sizeof(number)); for (i = 2; i <= maxn; i++) { if (number[i] == true) { for (j = 2; j * i <= maxn; j++) num原创 2021-02-03 20:46:18 · 134 阅读 · 0 评论 -
算法日记--第十日日记
今日内容–最小生成树kruskal()算法需要借助并查集,首先用结构体存入边,将边进行排序成为升序排序,接着选取权值最小的边,再将边的两个端点,进行并查集的父亲判断,如果属于一个父亲,就不能添加这条边,否则会形成环,如果不属于一个父亲,就更新父亲信息,将其更新为同一个父亲,直到找到n-1条边,就生成了最小生成树。struct node{ int me,zd,q;}edge[N*N];int n,m;int f[N];int find(int x) { return x == f[x] ?原创 2021-01-31 23:27:24 · 97 阅读 · 0 评论 -
算法日记--第九日日记
今日内容–最短路径Floyd算法,可以求出任意两点的最短路径,但是时间复杂度为O(n^3)。for (k = 1; k <= n; k++) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); } }}Dijkstra 算法,求单源最短路径,时间复杂度为O(nlogn)。(感觉写的是原创 2021-01-30 22:14:40 · 119 阅读 · 0 评论 -
算法日记--第八日日记
今日内容–哈希可以通过哈希函数(通常含有素数),将目标进行运算得到一个值(大数很难重复),进而通过哈希值的比较来判断问题的成立与否。例题:UVA 11475 将字符串转换为回文串两个存放hash值的数组,分别从字符串的前后进行哈希。之后再从前向后比较两个hash数组的值,算出需要添加的字符构成回文串。...原创 2021-01-29 22:29:15 · 111 阅读 · 0 评论 -
算法日记--第七日日记
今日内容–动态规划dp解题的思路是分解问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决。接下来确定边界情况,状态转移方程。例题:求出最长上升子序列的长度,比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)用maxlen表示第i个点的最长上升子序列,初始状态下,都为其本身,即为数字1,遍历数组,第二层循环中,从0到i进行遍历,如果i之原创 2021-01-28 23:44:17 · 121 阅读 · 0 评论 -
算法日记--第六日日记
今日内容–贪心优先队列(大根堆,默认为大根堆):priority_queue<int > qu;优先队列(小根堆):priority_queue<int,vector<int>,greater<int> > qu;贪心,就是找到局部最优解的思想,关键在于找到切入点,今日例题e和g较难,值得参考。...原创 2021-01-26 22:56:34 · 131 阅读 · 0 评论 -
算法训练--第五日日记
今日内容–线段树(对于一个数,想将它乘以二就将其左移一位,再想加一就|1)对于一个数组(大小为N),我们可以通过一个线段树数组(大小约为4N),用来存储其某段区间的信息,例如最大值,区间和。通常会有build函数,用来建造线段树。void build(int L, int R, int i) { tree[i].left = L; tree[i].right = R; if (L == R) { tree[i].sum = arr[L]; return; } int mid = (原创 2021-01-26 22:28:43 · 84 阅读 · 0 评论 -
算法训练--第四日日记
今日内容–搜索bfs从起点开始,逐步向外扩散,扩散的过程中将点入队列。矩阵迷宫寻终点问题([POJ-2251],从二维到三维的过程)dfs从某点开始,按照边不断递归搜索下一个点N皇后问题二分图染色对于一张图,如果可以把点分配成两派,某一派中,点之间没有关系,只存在派与派之间的关系,因此,在搜索中,可以将某一派标志为1,另一派标志为2,在搜索的过程中,如果发现同派同色的点有关系,就代表不是二分图。例题:hdu-5285拓扑排序用于解决有向图中是否有环的问题,对于节点,我们存储其入度信息,原创 2021-01-24 22:49:11 · 97 阅读 · 0 评论 -
算法训练--第三日日记
今日内容–二分前提:对于一个有序序列。如果直接从头,顺序查找,时间复杂度为O(n),引入二分查找,每次与序列的中间值进行比较,如果小于中间值,即可排除右区间,下次在左区间进行查找,同理,如果大于中间值,即可排除左区间,下次在右区间进行查找。从而,对于整数来说,即可逼近答案,而对于浮点数来说,需要预先定义好精度,当fabs(left-right)<ep时,即可结束判断。...原创 2021-01-22 22:31:01 · 97 阅读 · 0 评论 -
算法训练--第二日日记
今日内容–并查集用于解决将不相关的元素进行分组的情况。首先有fa[maxx]数组用于存储第i个元素的父亲是谁,初始状态都为i本身。find()函数使用路径压缩算法,一边查找父亲信息,一边更新,即有:return x == fa[x] ? x : (fa[x] = find(fa[x]));merge()函数void merge(int x, int y){ int fx=find(x),fy=find(y); fa[fx] = fy;}可用于解决吃饭分桌问题hdu-1213原创 2021-01-22 00:11:47 · 154 阅读 · 0 评论 -
算法集训--第一日日记
今日内容-----STLstring 动态字符串//迭代器的引入,利用auto it:type 的方法智能对对象进行迭代string 常用方法 clear() lenth() push_back()find() 方法返回查找内容的下标,若无返回值-1append() 追加内容----string类型可以用s1+s2来追加,append好处是可以追加参数(s2,3) --3为长度 也可(s2,3,3)从下标3开始截取长度为3的字符串erase() 删除指定长度的字符串vector 动态数组(内原创 2021-01-20 23:04:26 · 144 阅读 · 0 评论