随笔分类 - 具体问题
摘要:算法 数据范围一眼数学题 然而考场并没有思路 这一类题显然要将 \(\gcd{(a, b)}\) 消掉或者表示 ( \(\rm{lcm}{(a, b)}\) 可以用 \(\gcd{(a, b)}\) 表示) 考虑 \(a = \gcd{(a, b)} * k_1\) 和 \(b = \gcd{(a,
阅读全文
摘要:算法 暴力 建图直接跑 Kruskal, 显然能通过 \(64pts\) 的点 正解 分析 Kruskal 的复杂度 发现比较边权非常的浪费, 很显然是不必要的 并查集求环路也浪费了网格图的性质 考虑优化 把每一条边看做一个整体, 整体比较只需要 \(O((n + m) \log (n + m))\
阅读全文
摘要:题面 题目下载 算法 猜测最优解是 每一次染色都是之前染色的子集且颜色相反(证明不会) 所以可以逆向思维(注意直接逆向不成立) 最后一次染色一定在一个四连通块中, 之前的染色一定是后一次染色的超集 把每个颜色的连通块缩点, 例如 每次将一个点(即原图中的连通块)染色成反色, 相当于加入了与之连接的反
阅读全文
摘要:算法 特殊性质 显然链的情况就是括号匹配 因此显然有代码 代码 #include <bits/stdc++.h> #define int long long const int MAXN = 5e5 + 20; int n; std::string Braket; int fa[MAXN]; boo
阅读全文
摘要:题面 题面下载 算法 转化题意 说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小) 看着像一种在 y 轴方向排序的 dp 但是由于是折线, 所以需要加一维来判断转向 dp 设计 状态设计 \(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上 状
阅读全文
摘要:题面 题目下载 算法 考虑当 \(k\) 确定的时候如何求答案, 显然对于所有形如 \([ak, (a+1)k)\) 的值域区间, 最大值一定是最优的 似乎怎么都是 \(O(n^2)\) 的算法 观察到 \(a_i\) 的值域比较小, 所以考虑桶 显然对于一段区间 \([L, R]\) 我们可以推出
阅读全文
摘要:算法 暴力 容易发现双指针可以找到每一个区间 \([L, R]\), 使得这个区间覆盖 \(1\) ~ \(n\) 的每一个数, 也即区间外覆盖 \(1\) ~ \(n\) 的每一个数, 这是 \(O(n)\) 的 考虑判断 对于两个数列 \(A\), \(B\) 显然, 在 \(A\) 中先取出的
阅读全文
摘要:算法 性质 首先容易观察到 \[\text{mex} (w_1, w_1 \And w_2, w_1 \And w_2 \And w_3,\cdots , w_1 \And w_2 \And w_3 \And \cdots w_k) \]中 集合 \[\mathbb{V} = {w_1, w_1 \
阅读全文
摘要:题目 下载链接 算法 可以发现是求逆序对 时间复杂度限制在 \(O(n \log n)\) 树状数组 记录每一个值的多少 转化为求前缀和 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int
阅读全文
摘要:算法 看完题目不好想到思路 逆向思维, 考虑从目标串刷成一个由全部相等的颜色组成的串 由于一刷刷一堆想到区间 状态 设 \(dp_{l, r}\) 表示区间 \([l, r]\) 的最少涂抹次数 状态转移 分类讨论 \(S_l = S_r \text{ 且 } l < r\) 此时分别去掉两个端点,
阅读全文
摘要:算法 发现矩阵的每一行满足最优子结构性质 问题简化为 对于一个长度为 \(m\) 的数列, 每次取其首尾的数 显然可以用区间 dp 解决 状态定义 \(dp_{i, j}\) 表示区间 \([i, j]\) 的最优价值 状态转移方程 \[dp_{i, j} = \max {(dp_{i - 1, j
阅读全文
摘要:算法 状态定义 最初显然可以想到 \(f[i][j][k]\) 表示 \(A\) 串前 \(i\) 个, \(B\) 串前 \(j\) 个, 分割了 \(k\) 个子串 但是这样无法递推 \(k\) 维 于是加上一位 \(f[i][j][k][0/1]\), 最后一维表示是否选择 \(A\) 子串当
阅读全文
摘要:算法 观察到插入都在末尾进行 考虑逆向ST表 代码 #include <bits/stdc++.h> const int MAXSIZE = 2e5 + 20; #define int long long int Time, D; int t = 0; /*反向st表方便处理末尾的插入*/ clas
阅读全文
摘要:算法 基础 发现插入总在最后一个进行 单调栈维护一个区间的 \(max / min\) 单调队列维护以一个值为 \(max / min\) 的最大区间 显然可以使用单调栈维护 其原理为 当 \(a, b \in seq, a < b, pos[a] < pos[b]\) 那么显然 \(a\) 没有卵
阅读全文
摘要:题目链接 Fish 算法 状压dp 维护余下鱼的存在集合 代码 #include <bits/stdc++.h> const int MAXN = 20; const int MAXSize = (1 << 18); int n; double P_eat[MAXN][MAXN]; //第 i 条鱼
阅读全文

浙公网安备 33010602011771号