怎样提高智商
from vfleaking
算法一
有一种算法叫做手算。只要你脑力足够,算出
算法二
有一种算法叫做爆搜。我们裸暴力搜索
这题我不会做,但是我能A
其实你只要把小范围的答案搜出来会发现是
然后打出方案之后我们就更放心了。
-
1. 编号小于
的题目中你一共选了几个 A?- A.
个 - B.
个 - C.
个 - D.
个
- A.
-
2. 编号小于
的题目中你一共选了几个 A?- A.
个 - B.
个 - C.
个 - D.
个
- A.
-
3. 编号小于
的题目中你一共选了几个 A?- A.
个 - B.
个 - C.
个 - D.
个
- A.
这样看起来就感觉是最多的,掐之一算确实是
可不可以靠谱一点啊
我们考虑一张试卷,考虑每次填答案,如果每次我都有不超过
如果要比
假设
于是我们就证明了,如果没有 sb 题,答案数不超过
什么你不知道为什么全是 A 全是
怎样更有力气
from jiry_2
算法一
我们可以把所有边连出来然后暴力跑最小生成树,时间复杂度
算法二
引理一:对于一张已有的边长度都小于等于
简要的证明如下:
首先对于求最小生成树这个问题来说,如果我们从小到大插入边,那么已经在一个联通块中所有的点是等价的。如果我们把这个点集里的所有点连成完全图时合并了
所以我们只需要对每一个询问连
算法三
因为树形状为链时的算法和树没有太大的算法没有具体的区别(为链的情况专门为一些奇葩算法比如要维护区间啊啥的以及细节写残的标算准备),所以接下来开始介绍标算。
由引理一,对于每一个修建操作,求出联通块之后,我们只需要考虑这个操作的点数条边就好了。但是我们只知道实际连边的补图,直接求联通块的复杂度是
我们可以选取度数最小的点,没有和这个点连边的所有点一定是和这个点在一个联通块中,剩下的点暴力连边DFS就好了。
假设当前操作的补图有
如果一次修建操作中,存在一个点它没有删过一条相连的边,那么这一次修建操作的所有点一定联通,这时我们只需要和算法二一样处理就好了。
那么我们要单独处理的修建操作总点数是
这样在一番预处理之后,我们得到了很多条单独联通的链和很多条单独的边,而链可以通过算法二的方案处理得只剩下
其它算法
咳咳大家好我是 vfleaking,我来说下我的算法。由于连通块在树上可能不是连续的,所以我们用两个并查集维护这个图,第一个并查集会把在一个连通块的点缩起来,而第二个并查集,如果结点
看起来我们要同时操纵两个并查集?其实第二个并查集没必要特别维护,只要在每次 find_father 找到达到顶端时,顺便检查下跟自己的父亲是不是在一个连通块,是的话就自动缩起来再继续 find_father。
我们还是把
可是怎样才能每次快准狠找一个连接两个不同连通块的边?这个就乱搞吧。我的方法是把连通块依次加入,每次考虑新加进来的和之前的已加入的连通块之间的边,暴力扫扫,最后把被合并的连通块清理掉(因为已经和那个新的连通块是一体的了)。
如果你跟我想得一样,那么是链的情况就有点良心,因为我们可以不用第二个并查集,而是用一个 STL 的 set 或者 map 维护是同一个连通块的区间。当然,还是自动维护。
怎样跑得更快
from taorunz
算法一
对于第一个数据,
期望得分:5分
算法二
对于20%的数据
期望得分:20分(如果你卡常数卡的好,可以通过
算法三
对于40%的数据
期望得分:40分(如果你卡常数卡的好,可以通过
算法四
到此为止,我们的解法都没有用到
对于点2,12,17,有
这个就等价于:
我们发现,方程右端与
这样可以得到15分。加上算法四可以得到50分(卡常数75分)
算法五
对于点5,15,16,有
我们把这个矩阵
我们还可以发现:
对于
注意到
我们只要把乘上
好懂的算法
咳咳大家好我是 vfleaking,我来说下好懂的。
首先学过小学奥数的我们知道:
但是其实这种题都可做:
可能很多人的注意力都在“这玩意儿怎么解啊”,其实只要换个姿势问问自己 “要是有人告诉了我
其实关键的坑人的地方在于
for (int i = 1; i <= n; i++)
f_r[i] = f[i];
for (int i = 1; i <= n; i++)
for (int j = i + i; j <= n; j += i)
f_r[j] -= f_r[i];
看起来是
为什么要这样?因为我们知道如果
所以我们可以写出这样的等式:
接下来怎么办?好像并没有简化问题。我们把两个求和符号反过来,得到:
然后我们移一下项:
仔细观察,发现
这个式子的意思是,对于每个
for (int i = 1; i <= n; i++)
f_z[i] = b[i] / g(i);
for (int i = 1; i <= n; i++)
for (int j = i + i; j <= n; j += i)
f_z[j] -= f_z[i];
这样得到的
但是
现在知道左边,想求右边,怎么办?是不是还是似曾相识呢!由于我们知道
for (int i = 1; i <= n; i++)
hx[i] = z[d];
for (int i = n; i >= 1; i--)
for (int j = i + i; j <= n; j += i)
hx[i] -= hx[j];
嗯,现在我们知道了
由于中间过程涉及了除法,所以就会带来无解和多解的情况。对于本题
罗嗦了半天其实跟算法五本质是一样的。这题其实就是把