拓扑排序
Directing Edges
此题很巧妙,先用拓扑排序排出来,再利用拓扑序构造解
Author: Fyind
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2020-08-16
数据结构
前缀和和差分 https://ac.nowcoder.com/acm/contest/19483 普通前缀和 前缀和数组 对于数组 \(A\) 的前缀和数组 \(s\) 是 \[ s[x]=\sum_{i=0}^{x}A[i] \] 递推公式 \[ s[x]=s[x-1]+A[x] \\ s[0]=0 \] 广义前缀和 把求和看成某种操作的累加。 维护dp矩阵 DP转移用矩阵表示,然后可以用前缀和维护 求 \[ dp(l,r) = dp(1,r)-dp(1,l) \] 设初始列向量为 \(\textbf{v}\), 转移矩阵为 \(mat[i]\) 然后 \[ dp(l,r) = mat[r] \cdot mat[r-1] \cdot mat[r-2]...mat[l+1] \cdot \textbf{v} \] 所以我们维护一个左乘矩阵前缀和 \[ sum[i] = mat[i] \cdot mat[i-1] ... mat[2] \cdot mat[1]\\ sum[i]=mat[i] \cdot sum[i-1] \] 维护好之后计算的时候: \[ dp(l,r) = su...
2020-08-14
数学
基础知识 求和符号 \[ \sum_{i=1}^{n}=a_1+a_2+a_3+...+a_n \] 求和符号的性质 结合律 \[ \sum_{i=1}^{n} \sum_{j=1}^{n} a_i b_j = \sum_{j=1}^{n} \sum_{i=1}^{n} a_i b_j \] 分配率 \[ \sum_{i=1}^{n} a_i \cdot k = (\sum_{i=1}^{n}a_i) \cdot k= k\sum_{i=1}^{n}a_i \\ \sum_{i=1}^{n}\sum_{j=1}^{n}a_i b_j = \sum_{i=1}^n (a_i\sum_{j=1}^n b_j) = (\sum_{j=1}^{n}b_j)\cdot(\sum_{i=1}^{n}a_i) = (\sum_{i=1}^{n}a_i)\cdot(\sum_{j=1}^{n}b_j) \] 改变枚举对象 令 \(z=x+y\) \[ \sum_{x=0}^a\sum_{y=0}^b f(x,y) = \sum_{z=0}^{a+b}\sum_{y=0}^zf(z-y,y) \...
2020-08-10
AtCoder题解
AtCoder Grand Contest 047 AtCoder Grand Contest 047 A. Integer Product 给定 \(n\) 个浮点数,计算有多少个 \((i, j)\) 使得 \(A_{i} \cdot A_{j}\) 是整数 \(2\leq N \leq 200 \ 000\) , $ 0 < A_{i} ^{4}$ , \(A_{i}\) 最多 \(9\) 为小数. 思路 通过题设条件缩小范围, 枚举 由于数据比较大,不能直接暴力做。判断是整数这个条件不太好集体维护。所以要找出题目中的特性,看看有没有机会让范围缩小。最好是可以 先考虑 \(A_{i} \cdot A_{j}\) 什么情况下是整数。发现,对于任意有限小数 \(x\), 可以在乘上 \(10^{n}\) 后肯定会变成整数。所以每个数必然是 \(k\cdot 2^{m}\cdot 5^{n}\) 的形式, 通过乘 \(10^{n}\) 把分母上的 \(2^{m}\cdot 5^{n}\) 约去. 而之前的 \(k\) 不影响答案。所以我们只要考虑 \(2^{m}\cd...
2020-07-29
CodeForces题解
Educational Codeforces Round 92 (Rated for Div. 2) link A. LCM Problem 构造 给定区间 \([l,r]\) 求 \(2\) 个在里面的数,使得它们的最小公倍数也在区间内,否则输出-1 -1 . 可以知道 \(l, l*2\) 是2个最小的可能组合,只要判断 \(l*2 > r\) 即可. B. Array Walk 贪心 由于可以折返的步数比较少。我们可以枚举折返的步数。当折返的步数固定为 \(j\) 的时候。有2种情况, \(j\) 步都是折返后又回来。这种情况最远走到了 \([1,k-2j]\) \(j-1\) 步是折返后又回来,最后一步是折返后不回来。这种情况的区间是 \([1,k-2(j-1)-1]\) 可以证明:若折返,则必定是在当前区间的最大两个相邻元素间折返。 那么我们用前缀和的方式求出 \([1,i]\) 的和还有最大相邻元素的位置。那么分情况讨论这两种情况的最大值。最后取个更优的解即可 \(O(n)\) 123456789101112131415161718192021222...
2020-05-26
三行写完高斯消元,这就是Python!!!
三行写完高斯消元,这就是Python!!! 洛谷评测链接 先给大家看一眼核心代码 核心代码 123for i in range(len(a)): row = [j for j in range(len(a)) if a[j][i] != 0 and sum(a[j][:i]) < 1e-8][0] a[:] = [r + a[row]*(-r[i]/a[row][i]) if j != row else r/a[row][i] for (j,r) in enumerate(a)] 没错,就只有三行,完成了高斯消元最核心的操作,把矩阵消元成主对角线为1,其余除了常数项全是0的形式。我只用了Python中的切片操作,列表解析式,还有numpy中array的性质。 为了方便大家理解,我先来介绍一些这些python中的语法 python语法介绍 切片 语法格式是 [开始:结束] 可以取出列表中的一段区间,如果不填写就是默认开始位置是0,结束位置是列表最后一个元素位置。注意这里的区间是左闭右开区间。并且支持倒着数,也就是使用负号 比如: 12345l = [0,2,3,4...
2020-08-10
Trie
Trie Trie 是一个用树来存储字符串的结构。 基本操作 插入一个字符串 查找一个字符串是否在树中 维护对应字符串的附加信息(如个数之类的) 模板 P2580 于是他错误的点名开始了 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <bits/stdc++.h>using namespace std;const int maxn = 1e4 + 5;const int maxnode = maxn * 50;const int sigma_size = 26;#define c ((ch)-'a')int child[maxnode][sigma_size], val[maxnode];int sz, n;void insert(string s) { int u = 0; // 从根节点 u = 0 开始插入 for (char ch : s) { i...
Announcement
欢迎来逛逛我的博客