随笔分类 - 算法竞赛
摘要:定义 欧拉回路Eulerian Cycle:通过图中每条边恰好一次的回路 欧拉通路Eulerian Path:通过图中每条边恰好一次的通路 欧拉图:具有欧拉回路的图 半欧拉图:具有欧拉通路但不具有欧拉回路的图 欧拉图中所有顶点的度数都是偶数。 若 G 是欧拉图,则它为若干个环的并,且每条边被包含在奇
阅读全文
摘要:LeetCode 741. 摘樱桃 https://leetcode.cn/problems/cherry-pickup/description/ LeetCode 1463. 摘樱桃 II https://leetcode.cn/problems/cherry-pickup-ii/descript
阅读全文
摘要:Reduce (C++17) ll s = reduce(a + 1, a + 1 + n); // 求和 ll s = reduce(a + 1, a + 1 + n, std::plus<ll>); // 求和 double s = reduce(a + 1, a + 1 + n, std::m
阅读全文
摘要:二分答案的复杂度log(ans),check的复杂度一般至少是O(n)(甚至是nlogn),那么q次询问的复杂度就是 \(O(q*log(ans)*n)\) q通常与n同规模。如果把询问合并到一起回答,就可以优化复杂度,这也是整体二分的不一样之处。总的来说,对整个ans的值域像线段树一样进行递归,每
阅读全文
摘要:想着一直都没有写过三分的模板,每次都是用for循环收尾,习惯确实不太好。 三分法求先增后减或者先减后增函数的最值。其实都没必要是上凸或者下凸的函数。 下面是每次缩减1/3长度的写法,比较容易理解,面对负数等情况也不容易出问题。 // x = 4, f(x) = 20 ll f (ll x) { re
阅读全文
摘要:最大公因数(GCD) 两个数的最大公因数很好做,使用内置的库函数即可,注意x和y的类型要相同。 ll gcd = __gcd (x, y); 如果要求多个数的最大公因数,那么初始化为0(因为根据定义,0和任何数x的gcd都是x,所以0是gcd操作的幺元),然后分别进行gcd即可。 ll gcd =
阅读全文
摘要:父级页面:【数学】组合数学 卡特兰数 记号为 \(H_n\) 第n个卡特兰数,下面的n就是指这个。 \(H_0=1, H_1=1, H_2=2, H_3=5, H_4=14, H_5=42\) 卡特兰数最常见的场景是合法的括号序,还有栈进出的方案。他们的特点就是“右括号”、“出栈”的次数不能超过剩余
阅读全文
摘要:父级页面:【数学】组合数学 排列 组合 可重排列 可重组合 隔板法 盒子可以为空 隔板法:x个相同的小球,有y个不同的盒子,每个盒子可以为空,求有多少种方案数?把y个不同的盒子视作y-1个不同的隔板,然后把小球视作不同的,全排列有 \(A_{x+y-1}^{x+y-1}\) 种,然后除以隔板的全排列
阅读全文
摘要:问题描述 给出 \(n + 1\) 个二维平面上的点对 \((x_0, y_0), (x_1, y_1), (x_2, y_2), \cdots, (x_{n}, y_{n})\) ,求一个经过这些点的不超过 \(n\) 次的多项式 \(P(x) = p_{n} \cdot x^{n} + p_{n
阅读全文
摘要:树的重心的定义是,对树中的某个点,以这个点为根,然后它会拥有若干棵子树,取出最大的那棵子树的size,然后在所有点中求最小的最大的子树的size的点,这个点就是树的重心。简单来说就是找到某个点r,去掉r之后,每棵子树是长得最平均的。树的重心最多有2个(这时候重心其实是在这两点之间的边上),最少有1个
阅读全文
摘要:Manacher算法的本质是计算以字符串中的“每个字符”和“每两个相邻字符之间的空隙”作为对称中心的最大回文串的长度。所以利用这个性质可以解决一系列与子串是否是回文串、子串有多少是回文串的问题。 namespace Manacher { static const int MAXN = 1e6; in
阅读全文
摘要:原本不想写这个的,但是今天错了一次。写一下让自己以后多一个参考。 Floyd算法初始化两点之间的距离为无穷大,然后自己到自己的距离为0。 然后枚举所有的边,初始化对应两点的边权,注意处理平行边或者自环的情况。推荐用min操作。 第一维枚举中转点k,也就是阶段。 第二第三维枚举图中的两点i, j,也就
阅读全文
摘要:Codeforces的交互题有点难以调试,写了一个模板方便本地调试。 struct Oracle { private: static const int MAXN = 2e5 + 10; int n; ll a[MAXN]; ll query_cost; #ifdef LOCAL static co
阅读全文
摘要:强烈建议insert之前先reserve出估计的元素大小,毕竟是静态set实际上大概要用多少空间是可以提前知道的。这样一方面可以节省大约20%内存,另一方面避免了扩容时复制,速度大概提升了10%。 template <class value_type> struct const_set { priv
阅读全文
摘要:map可以动态进行插入删除等操作,但其常数太高了。 如果只用一个有序数组来存储的话,那么可以提供更好的查询复杂度的常数,同时在构建的时候由于不需要保存额外的信息所以非常节约内存:需要小心的是这个map只能找到第一个重复的元素,如果需要进行覆盖操作的话,一般还是得使用BST去做。当然也可以get之后对
阅读全文
摘要:最近打了一次 Codeforces ,发现有很多小 bug 其实可以用随机数据 + assert 就能找出来的。而且也能验证一些猜想或者打表。每次都写这个东西太耗时间了。现在临时写一个后面慢慢完善。 ```cpp namespace RandomGenerator { const int MAXN
阅读全文
摘要:把一个数组的元素,从左到右插入笛卡尔树,可以用栈O(n)地构建出来。笛卡尔树上的节点满足堆的性质(小根堆就是一个节点小于其两个子节点的权值)。所以用这个方式扫描出的笛卡尔树,一棵子树就是对应一段连续的区间,而子树的根节点就是这段区间的最值(小根堆就是最小值)。 以最大矩形面积的小根堆为例: 从根节点
阅读全文
摘要:手写二分在涉及负数的时候,处理得不好容易导致死循环,比如下面这个例子: 对于任意的 \(x_1<x_2\) ,若 \(check(x_1)\) 为真,则 \(check(x_2)\) 也为真(真区间在右边)时: ll findFirst (ll L, ll R) { while (L < R) {
阅读全文

浙公网安备 33010602011771号