void ST_prework() { for (int i = 1; i <= n; i++) f[i][0] = a[i]; int t = log(n) / log(2) + 1; for (int j = 1; j < t; j++) for (int i = 1; i <= n - (1<<j) + 1; i++) f[i][j] = max(f[i][j-1], f[i + (1<<(j-1))][j-1]); } int ST_query(int l…
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= l; i--) { if (s[i] == '(') j++; if (s[i] == ')') j--; if (j == 0 && s[i] == '+') return calc(l, i - 1) + calc(i + 1, r); if (j == 0 && s[i]…
// 假设字符串由小写字母构成 int trie[SIZE][26], tot = 1; // Trie的插入 void insert(char* str) { int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { int ch = str[k]-'a'; if (trie[p][ch] == 0) trie[p][ch] = ++tot; p = trie[p][ch]; } end[p] = true; } // Trie…
next[1] = 0; for (int i = 2, j = 0; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) j = next[j]; if (a[i] == a[j+1]) j++; next[i] = j; } for (int i = 1, j = 0; i <= m; i++) { while (j > 0 && (j == n || b[i] != a[j+1])) j = next[…
目录 线段树简介 线段树的简单代码实现 建树代码 修改操作 查询操作 线段树的查询操作的时间复杂度分析: AcWing245. 你能回答这些问题吗 思路 代码[时间复杂度:\(O( \space(N+M)logN)\) ] 错误分析 AcWing246. 区间最大公约数 思路 代码 总结 延迟标记 回顾并查集 概览 AcWing243. 一个简单的整数问题2 总结与反思 代码 扫描线 AcWing247. 亚特兰蒂斯 思路 DeBug 代码 思路解析 AcWing248. 窗内的星星 思路 代码…
RMQ问题(区间最值问题Range Minimum/Maximum Query) ST算法 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列a,回答若干询问RMQ(A,i,j)(i, j<=n),返回数列a中下标在i,j之间的最小/大值.如果只有一次询问,那样只有一遍for就可以搞定,但是如果有许多次询问就无法在很快的时间处理出来.在这里介绍一个在线算法.所谓在线算法,是指用户每输入一个查询便马上处理一个查询.该算法一般用较长…
137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花. 例如ai,1,ai,2,-,ai,6和ai,2,ai,3,-,ai,6,ai,1 就是形状相同的雪花. ai,1,ai,2,-,ai,6和ai,6,ai,5,-,ai,1 也是形状相同的雪花. 我们称两片雪花形状相同,当且仅当它…
背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选择的物品的体积不超过背包体积的情况下,使得获得的总价值最大. 0/1背包的时间复杂度是\(O(n*m)\). 空间复杂度随着写法的不同而不同. 方法一:按照定义写 #include <bits/stdc++.h> using namespace std; int n, m;//n表示的是商品的数目…
AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置.(这样状态表示仅仅需要每一行的人数就行了) 下一行的人数不能多余上一行 有两种思考方式: lyd思考方式: 现在已经安排好学生了,dp[a][b][c][d][e]是按照这种方法安排的总的方案数.然后往以后的情况推倒. y总思考方式: 思考怎样才能推倒到现在的情况. 时间复杂度分析: 第一排,第二…
并查集简介 并查集的两类操作: Get 查询任意一个元素是属于哪一个集合. Merge 把两个集合合并在一起. 基本思想:找到代表元. 注意有两种方法: 使用一个固定的值(查询方便,但是在合并的时候需要修改大量的值,比较复杂) 使用树形结构,这样合并的时候可以直接让一个叫另一个 eg. f[root1] = root2 并查集的路径压缩以及按秩合并 路径压缩:在每一次进行合并的时候,顺便更改每一个节点的值.(均摊复杂度:\(O(logN)\)) 按秩合并:每一次查询的均摊复杂度是\(O(logN…