随笔分类 - 51nod
摘要:把 $a_ib_{n i}$ 看成一项求和 则 $a_{i+1}b_{n i 1}=(a_i p + r) 3 q^{n i 1}=a_i 3 q^{n i} (\frac{p}{q}) + 3 r q^{n i} (\frac{1}{q})=a_ib_{n i} (\frac{p}{q})+ 3
阅读全文
摘要:$dp[i][0/1]$ 表示考虑前 $i$ 个元素,以 $i$ 结尾的最大子段和,$0$ 表示还未交换过,$1$ 表示已经交换过 $dp[i][0] = a[i] + \max\{dp[i 1][0],0\}$ $dp[i][1] = \max\{dp[i][0],dp[i 1][1]+a[i],
阅读全文
摘要:从高到低考虑每一位,把当前位为 $1$ 的点集称为 $S$, 当前位为 $0$ 的点集称为 $T$,那么最小生成树就是 $S$ 的生成树 + $T$ 的生成树 + $S$ 和 $T$ 之间连一条最短的边。 前两个部分递归处理,最后一部分把 $T$ 插入字典树,枚举 $S$ 中的点在字典树中查找即可。
阅读全文
摘要:长度为 $2$ 的可以直接求,之后就不把 $2$ 当质数了。 考虑一对 $(i,j)$ 会出现在多少个区间里,其中 $|j-i+1|\in \mathbb{P}$ 当 $i+j\leq n +1$ 时,一对 $(i,j)$ 会出现在 $[|i-j|+1,i+j]$ 这个区间里面所有质数长度里面,记
阅读全文
摘要:$\sigma_{0}(ij)=\sum\limits_{x|i}\sum\limits_{y|j}[x\bot y]$$\sigma_{1}(ij)=\sum\limits_{x|i}\sum\limits_{y|j}\dfrac{xj}{y}[x\bot y]$所以 $$\begin{align
阅读全文
摘要:看了讨论区一个回答恍然大悟,%%% 幂级数 $F(x)=A(x)^p$,那么有 $F^{'}(x)=pA^{'}(x)A(x)^{p-1}$,$A(x)F^{'}(x)=pF(x)A^{'}(x)$。若 $a_0,a_1,\dots$ 的普通生成函数为 $A(x)$,令 $s_n=\sum \lim
阅读全文
摘要:直角三角形的三边都可以表示为 $x=t(a^2-b^2),y=2tab,z =t(a^2+b^2)$,$t,a,b$ 都是整数且 $a>b,\gcd(a,b)=1$,$a,b$ 为一奇一偶。可以预处理出 $C_i$ 表示 $t=1$ 时有多少直角三角形的周长为 $i$,这个暴力枚举 $a$,$b$
阅读全文
摘要:1052 dp即可$dp[i][j]$ 表示前 $i$ 个数分成 $j$ 段。$dp[i][j]=a[i]+\max\{dp[i-1][j], \max\{dp[k][j-1]\}\}$前缀max优化一下即可 #include <bits/stdc++.h> #define ll long long
阅读全文
摘要:根据题意,需要交换的部分会形成若干个不相交的环,独立处理每个环。 每个环可以用环内的最小值去和其它元素交换,或者用全局最小值和环上最小值交换,做一遍再交换回去。 #include <cstdio> #include <cstring> const int MOD = 9973; int m, n,
阅读全文
摘要:[传送门] 欧拉序可以 $O(1)$ 得到两点的 LCA 线段树维护区间直径,两个区间合并时,新的直径的端点肯定是这两个子区间直径的端点。 复杂度 $O(nlogn)$ #include <cstdio> #include <cstring> #include <cctype> #include <
阅读全文
摘要:好久没刷51nod了,又听说topcoder有很多好题。那么就来51nod上刷吧。(那个客户端搞得有点烦(看不懂)) [1366 贫富差距] 当图不连通的时候,答案为无穷大。 当图连通时,两个点之间的最大差值就是最短路长度乘上 $d$,跑floyd再看最短路的最大值即可。 1 #include <b
阅读全文
摘要:[传送门] 直接想最暴力的做法就是正解了。每次询问都把两个串的回文树建出来,然后再两棵树上同时dfs,经过相同的节点答案就加一。遇到一个不存在的就退出。再把询问记忆化一下就OK了。复杂度是 $O(n \sqrt n)$因为每次dfs的复杂度跟短的串的长度有关。自己写给写T了。学习了下优秀写法。多开一
阅读全文
摘要:[传送门] 考虑计算直径的 dp 方法。 $d[u]$ 表示以 $u$ 为根的子树能 $u$ 能走到的最远距离 $dp[u]$ 表示以 $u$ 为根的子树的直径那么每次dfs一个子节点后$dp[u] = max(d[u] + d[v] + 1, dp[u])$$d[u] = max(d[v] + 1
阅读全文
摘要:[传送门] 很明显,可以转化成求每个点在两棵树中对应的子树中有多少个相同的节点,对答案的贡献就是$C(x, 2)$。关键就是怎么求这个东西。一是,对第一棵树求出dfs序,然后dfs第二棵树,用树状数组维护节点是否遍历到。对应下标就是第一棵树的dfs序,求每个节点递归其子树前后对应子树的区间和,作个差
阅读全文
摘要:[传送门] 首先有个贪心的想法,从叶子到根的路径的值呈递增更优,也就是大的深度越浅越好,因为如果把一个小的值放在深度浅的节点,则这以下的叶子节点都会被这个小的值影响,那么就肯定有更优的解代替这个放法,那么当叶子确定一个值的时候,从它往上的节点的相对大小就可以被确定了。因为叶子节点只有20个,往状压D
阅读全文
摘要:[传送门] 写的时候一直没有想到离线解法,反而想到两个比较有趣的解法。一是分块,$f[i][j]$表示第$i$块块首元素到第$j$个元素之间满足条件的最大值(即对$B_l + B_r \in K$的$A_l + A_r$的最大值)。这个可以$O(nm\sqrt n)$预处理,查询就$l$属于的块$p
阅读全文
摘要:[传送门] 首先,树剖无疑。其次,不会了... 搜了发题解才知道咋写。 没有什么正(wo)常(hui)点(xie)的线段树直接做的写法。换个形式,发现题目中的修改可以用矩阵乘法来表示一个节点用一个$1 \times 3$的矩阵来表示$$\begin{bmatrix} 1 & v & t \end{b
阅读全文
摘要:[传送门] 单调栈其实就是个后缀$max/min$,这道题可以维护一个单调递减的单调栈,pop元素的时候,能pop掉的元素就是第二大,当前元素为第一大。遇到第一个不能pop掉的时候当前元素就是第二大,不能pop掉的元素就是第一大。 #include <bits/stdc++.h> using nam
阅读全文
摘要:[传送门] 推推式子$$ \dfrac {1}{N!} = \dfrac{1}{X} + \dfrac{1}{Y} $$$$ \dfrac {1}{X} = \dfrac{1}{N!} - \dfrac{1}{Y} $$$$ \dfrac {1}{X} = \dfrac{Y - N!}{YN!} $
阅读全文

浙公网安备 33010602011771号