【算法介绍】点分治算法
算法简介:理清逃跑路线点分治是一种处理树上任意点对路径的算法,他可以更据每一个路径的组成部分进行分治。对于我们选出树上上的点 $\tt root$ 作为根,一条路径可以分为:
与根无关
端点为根
经过根
根据这些信息,我们可以用分治的思想处理这样的数据。
算法演示:都交给分身吧算法推导:快是第一奥义首先按照上面所说我们把一个路径分为了与根无关、端点为根、经过根这三种情况。不难直接想到可以用分治解决。因为与根无关,我们就去找子树,经过根我们就用两个端点为根的拼起来。
那么为了保证复杂度,我们最优的选择一定是以重心作为根。这样的话只会选择 log 次。
举个例子,我们要求一棵树上有没有距离为 k 的点对,我们对于选出来的根,枚举其所有的儿子,求出他的子树里面所有点对于他的距离,然后我们就看别的子树里面有没有距离和他能凑成 k 的就可以。
值得注意的是,在这种算法里,最好都不要使用 memset 这会导致复杂度不正确。
代码也好写:
123456789101112131415161718192021222324252627282930313233343536373839404142434 ...
【拾题杂谈】LuoguP5024 保卫王国
题面大秦为你打开题目传送门
题目描述Z 国有 $n$ 座城市,$(n - 1)$ 条双向道路,每条双向道路连接两座城市,且任意两座城市都能通过若干条道路相互到达。
Z 国的国防部长小 Z 要在城市中驻扎军队。驻扎军队需要满足如下几个条件:
一座城市可以驻扎一支军队,也可以不驻扎军队。
由道路直接连接的两座城市中至少要有一座城市驻扎军队。
在城市里驻扎军队会产生花费,在编号为 $i$ 的城市中驻扎军队的花费是 $p_i$。
小 Z 很快就规划出了一种驻扎军队的方案,使总花费最小。但是国王又给小 Z 提出了 $m$ 个要求,每个要求规定了其中两座城市是否驻扎军队。小 Z 需要针对每个要求逐一给出回答。具体而言,如果国王提出的第 $j$ 个要求能够满足上述驻扎条件(不需要考虑第 $j$ 个要求之外的其它要求),则需要给出在此要求前提下驻扎军队的最小开销。如果国王提出的第 $j$ 个要求无法满足,则需要输出 $-1$。现在请你来帮助小 Z。
输入格式第一行有两个整数和一个字符串,依次表示城市数 $n$,要求数 $m$ 和数据类型 $type$。$type$ ...
【算法介绍】高斯消元
算法简介:九鹦之喙高斯消元是一种快速求一些线性方程组的算法。消元法是一种用某一种未知数表示另外一种未知数从而减少未知数数量得到解的方法。而众所周知,消元法的理论基础是等式的性质。
算法演示:星虎之掌算法推导:蜂鸟之羽首先给出一个简单的三元一次方程组:
\begin{cases}
3x + 2y + z = 10\\
5x + y + 6z = 25\\
2x + 3y + 4z = 20
\end{cases}初中学过的消元方式就是加减消元、代入消元。解这个方程的话,首先用第二个式子变形分别消掉一三式子里面的 $x$ ,这是候一三方程式就构成了一个二元一次方程组,解出来了就全解出来了。
我们可以用一种矩阵的形式去表示整个方程组:
\left[\
\begin{matrix}
3&2&1&|&10\\
5&1&6&|&25\\
2&3&4&|&20
\end{matrix}
\
\right]我们定义初等变换有一下三种:
交换任意两行
对于某一行整体乘上一个数
对于任意两行相加或者相减
我们就不难模拟出一下流程
枚举主元,找到主元下面系数不为零的一行(有时为了精度,会选择主 ...
【算法介绍】拉格朗日插值法
算法简介:同袍的义理拉格朗日插值法,是一种已知多项式函数 $f(x)$ 上的 $k$ 个点 $(x_i,y_i)$ 求这个多项式的系数的东西。是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。
算法演示:僚佐的才巧算法推导 :御敌的执定多项式的系数表示法众所周知一个 $k$ 次多项式可以被它的 $k+1$ 个系数唯一地确定,即:
f(x) = \sum\limits_{i = 0}^{k}a_ix^i这种确定多项式的方法叫做多项式的系数表示法。
多项式的点值表示法众所周知,一个 $k$ 次多项式同样的可以被图上的 $k+1$ 个点唯一确定。我们设这个多项式的形式为:
f(x) = \sum\limits_{i = 0}^k a_ix^i那么我们把这几个点带入到这个式子里,就可以得到 $k+1$ 个 $k+1$ 元一次方程组(小学生都知道吧)
\begin{cases}
a_0+a_1x_1+a_2{x_1}^2+\dots+a_k{x_1}^{k}=y_1\\
a_0+a_1x_2+a_2{x_2}^2+\dots+a_k{x_2}^{k}=y_2\\
\dots\ ...
【拾题杂谈】GYM100517F Frequent Permutations
题面大秦为你打开题目传送门
题目描述彼得正在开发新的赌博软件。现在他正在编写一部分软件,可以处理纸牌组。为此,他需要生成从 $1$ 到 $n$ 的整数的随机排列。
不幸的是,彼得不知道这样做的好算法。所以他使用以下算法。首先初始化 $a[i] = i$ 。然后 $t$ 次选择从 $1$ 到 $n$ 的均匀随机 $i$ 和从 $1$ 到 $n$ 的随机 $j$ ,并交换 $a[i]$ 和 $a[j]$ 。
约翰了解了彼得生成随机排列的方法,并决定利用他的知识在赌场获胜。约翰想知道在彼得方法生成的排列中,哪种排列最常发生,它的概率是多少。
请帮助越好找到这个序列以及他的概率。
输入格式输入包含多组数据。
每一组数据输入一行两个整数 $n,t$ 含义如题面 $(\ 1\le n\le 14,0\le t\le 300\ )$ 。
最后一行输入两个零表示读入结束。
输出格式对于每组数据,输出两行,第一行输出出现概率最大的序列,第二行输出它出现的概率,用最简分数表示。
样例输入1233 3 3 4 0 0
样例输出12341 2 3 5/271 2 3 43/243
【拾题杂谈】GYM100517E Exam Scoring
题面大秦为你打开题目传送门
题目描述安德鲁在圣彼得堡国立搜索大学教授算法和数据结构课程,教授信息纳米技术、力学和光学。今天,他正在为他的学生举办笔试。考试包括 $n$ 个必须解决并提交评估的任务。
安德鲁检查了所有学生的考试作业,并了解每个学生和每个任务是否解决了。现在,他想为每个任务分配积分,以便由较少的学生解决的更难的任务获得更多积分。分配给任务的分数必须加起来为 $s$ 。
形式上,设 $a_i$ 为完成第 $i$ 个任务的学生人数,设 $a_i$ 为每个 $i$ 且大于 $0$ 。安德鲁想要一些 $b_i$ ,即 $a_ib_i = c$ 对于所有 $i$ ,其中 $c$ 是常数,$\sum\limits_{i = 1}^{n}b_i = s$ 。
不幸的是,这样的 $b_i$ 可能是分数。安德鲁不喜欢分数,所以他想用最小二乘法用整数 $p_i$ 来近似 $b_i$ 。此外,安德鲁认为给某些任务打得太低或太高都是不公平的。因此,对于给定的 $L$ 和 $U$ ,每个任务的分数必须介于 $L$ 和 $U$ 之间(包括 $L$ 和 $U$ )。
所以现在安德鲁需要找到整数值 $p ...
【拾题杂谈】GYM100517D Defend the Tower
题面大秦为你打开题目传送门
题目描述丹正在计划一场国际塔防游戏比赛,比赛拥有如下规。
战斗场地一排的十个格子,编号从 $1$ 到 $10$ 。每一个格子都有一些塔防守卫。同时有 $10 $ 个怪物,每个怪物的生命值为 $h$ 点,游戏时常的单位为秒。在 $1$ 到 $10$ 的每一秒开始时,一个新的怪物进入第一个单元格。每个怪物都有名为 delay 的特殊参数,默认情况下它等于 $1$ 。延迟塔可以增加怪物的延迟。如果一个怪物的的延迟是 $d$ ,并且在第 $t$ 秒开始时进入其当前单元格,则它会在第 $t +d$ 秒开始时移动到下一个单元格。有三种类型的塔:
枪炮塔:每一秒攻击当前格子的怪物。如果有多个怪物,则只有一个收受到伤害,受到伤害的顺序是先来先打。一个枪炮塔需花费 $3$ 美元建造,每次对于收到攻击的每个怪物造成 $1$ 点伤害。 用字母 $\tt G$ 表示
火箭塔:每三秒攻击当前格子的所有怪物。每次对于受到攻击的每个造成 $4$ 伤害,需要 $10$ 美元建造。用字母 $\tt R$ 表示。
延迟塔:每个怪物经过的最后五个格子中的延迟塔会造成怪物的延迟增加一点。举个 ...
【拾题杂谈】GYM100517B Bubble Sort
题面大秦为你打开题目传送门
题目描述众所周知,排序算法冒泡排序可以用如下的伪代码表示出来
12345define BubbleSort(a: array [1...n]) : for i from 1 to n - 1 : for j from 1 to n - 1 : if a[j] > a[j + 1] swap(a[j], a[j + 1])
我们把内部的一次循环称为冒泡迭代:
1234define BubblePass(a: array [1...n]) : for j from 1 to n - 1 : if a[j] > a[j + 1] : swap(a[j], a[j + 1])
实际上,不是所有的 $n - 1$ 次冒泡迭代都会被冒泡排序执行,一些数组会在一定次数的冒泡迭代后变得有序。比如说,数组 $[2,1,3,4]$ 在一次冒泡迭代后就会变得有序。
其实有很多的数组都只会经过一次冒泡迭代就变得有序,比如说由区间 $[1,3]$ 组成的数组的数字的 $6$ 个全排列中有 $4$ 个都只需要一次冒泡迭代就可以变得有序。 ...
【拾题杂谈】LuoguP1600 天天爱跑步
题面大秦为你打开题目传送门
题目描述
【拾题杂谈】AtCoder ABC299 G Minimum Permutation
题面大秦为你打开题目传送门
题目描述有一个长 $N$ 的序列,保证其中包含 $1$ ~ $M$ ,请你找到一个长 $M$ 的子序列,使得其中每个数字都出现了一次,并使得排列的字典序最小。
思路首先题目保证有解。我们考虑一下,我们可以从两个角度看问题,一是选择数字,二是删除数字。我们看这道题的考虑方向,我们要让字典序尽可能小,其实就是一些前面的大元素换到后面的替换过程,或者说更像插入和删除。这是候我们就不难想到,题目让我们求的序列,可以是原序列入栈出栈循环得到的产物。我们考虑如何去做这个栈。如果当前的这个树子比栈顶要小,那么把它替换过来坑定更优,但是在把栈顶删除的同时还要考虑能不能把它换回来,所以我们还要考虑后面还有多少种这个数字。基本思路就是这样,我们看代码:
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879// #pragma GC ...