![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
寒假集训
飞机大人
此人很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 · 62 阅读 · 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 · 95 阅读 · 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 · 63 阅读 · 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 · 69 阅读 · 0 评论 -
算法日记--第八日日记
今日内容–哈希 可以通过哈希函数(通常含有素数),将目标进行运算得到一个值(大数很难重复),进而通过哈希值的比较来判断问题的成立与否。 例题:UVA 11475 将字符串转换为回文串 两个存放hash值的数组,分别从字符串的前后进行哈希。之后再从前向后比较两个hash数组的值,算出需要添加的字符构成回文串。 ...原创 2021-01-29 22:29:15 · 73 阅读 · 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 · 74 阅读 · 0 评论 -
算法日记--第六日日记
今日内容–贪心 优先队列(大根堆,默认为大根堆): priority_queue<int > qu; 优先队列(小根堆): priority_queue<int,vector<int>,greater<int> > qu; 贪心,就是找到局部最优解的思想,关键在于找到切入点,今日例题 e和g较难,值得参考。 ...原创 2021-01-26 22:56:34 · 99 阅读 · 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 · 52 阅读 · 0 评论 -
算法训练--第四日日记
今日内容–搜索 bfs 从起点开始,逐步向外扩散,扩散的过程中将点入队列。 矩阵迷宫寻终点问题([POJ-2251],从二维到三维的过程) dfs 从某点开始,按照边不断递归搜索下一个点 N皇后问题 二分图染色 对于一张图,如果可以把点分配成两派,某一派中,点之间没有关系,只存在派与派之间的关系,因此,在搜索中,可以将某一派标志为1,另一派标志为2,在搜索的过程中,如果发现同派同色的点有关系,就代表不是二分图。 例题:hdu-5285 拓扑排序 用于解决有向图中是否有环的问题,对于节点,我们存储其入度信息,原创 2021-01-24 22:49:11 · 61 阅读 · 0 评论 -
算法训练--第三日日记
今日内容–二分 前提:对于一个有序序列。 如果直接从头,顺序查找,时间复杂度为O(n),引入二分查找,每次与序列的中间值进行比较,如果小于中间值,即可排除右区间,下次在左区间进行查找,同理,如果大于中间值,即可排除左区间,下次在右区间进行查找。从而,对于整数来说,即可逼近答案,而对于浮点数来说,需要预先定义好精度,当fabs(left-right)<ep时,即可结束判断。 ...原创 2021-01-22 22:31:01 · 60 阅读 · 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 · 106 阅读 · 0 评论 -
算法集训--第一日日记
今日内容-----STL string 动态字符串 //迭代器的引入,利用auto it:type 的方法智能对对象进行迭代 string 常用方法 clear() lenth() push_back() find() 方法返回查找内容的下标,若无返回值-1 append() 追加内容----string类型可以用s1+s2来追加,append好处是可以追加参数(s2,3) --3为长度 也可(s2,3,3)从下标3开始截取长度为3的字符串 erase() 删除指定长度的字符串 vector 动态数组(内原创 2021-01-20 23:04:26 · 110 阅读 · 0 评论