zhengrui集训笔记2

Day_6 计算几何

点 积 \Large 点积

叉 积 \Large 叉积

极 角 \Large 极角

< π \pi π :叉积判断

else :atan2

旋 转 \Large 旋转

左乘第一类正交矩阵

[ c o s   θ − s i n   θ s i n   θ c o s   θ ] [ c o s   ω s i n   ω ] = [ c o s   θ   c o s   ω − s i n   θ   s i n   ω s i n   θ   c o s   ω + c o s   θ   s i n   ω ] = [ c o s ( θ + ω ) s i n ( θ + ω ) ] \left[ \begin{array}{} cos\ \theta & -sin\ \theta \\ sin\ \theta&cos\ \theta\end{array}{}\right]\left[ \begin{array}{} cos\ \omega \\ sin\ \omega\end{array}{}\right]=\left[ \begin{array}{} cos\ \theta \ cos\ \omega -sin\ \theta \ sin\ \omega\\ sin\ \theta \ cos\ \omega +cos\ \theta \ sin\ \omega\end{array}{}\right]=\left[\begin{array}{}cos(\theta+\omega)\\sin(\theta + \omega)\end{array}{}\right] [cos θsin θsin θcos θ][cos ωsin ω]=[cos θ cos ωsin θ sin ωsin θ cos ω+cos θ sin ω]=[cos(θ+ω)sin(θ+ω)]

反 射 \Large 反射

左乘第二类正交矩阵

[ c o s   θ s i n   θ s i n   θ − c o s   θ ] [ c o s   ω s i n   ω ] = [ c o s   θ   c o s   ω + s i n   θ   s i n   ω s i n   θ   c o s   ω − c o s   θ   s i n   ω ] = [ c o s ( θ − ω ) s i n ( θ − ω ) ] \left[ \begin{array}{} cos\ \theta & sin\ \theta \\ sin\ \theta&-cos\ \theta\end{array}{}\right]\left[ \begin{array}{} cos\ \omega \\ sin\ \omega\end{array}{}\right]=\left[ \begin{array}{} cos\ \theta \ cos\ \omega +sin\ \theta \ sin\ \omega\\ sin\ \theta \ cos\ \omega -cos\ \theta \ sin\ \omega\end{array}{}\right]=\left[\begin{array}{}cos(\theta-\omega)\\sin(\theta - \omega)\end{array}{}\right] [cos θsin θsin θcos θ][cos ωsin ω]=[cos θ cos ω+sin θ sin ωsin θ cos ωcos θ sin ω]=[cos(θω)sin(θω)]

辛 普 森 积 分 \Large 辛普森积分

例1 求点P在直线AB上的投影点(垂足)

点积求投影长度

例2 求对称点

同上

例3 区分出两个向量的5种关系

叉积判断方向

然后当叉积为0,点积判断谁更长/方向

例4 判断两条直线位置关系

平行向量叉积为0

垂直向量点积为0

例5 判断两条直线是否相交

4次叉积,跨立实验

例6 求交点,保证有交点

x相等,y相等,解方程就完事了

特判在同一直线上

例7 求两条线段的最短距离

一定在端点处取到,直接求4次点到线段距离。

例8 多边形面积

逆时针叉积

例9 判断凸多边形

选一个点叉积,出现负的就是凹的

例10 判断点是否在多边形内

一:特判多边形上,画一条射线,交点偶数表示在外部,奇数个表示在内部。斜率取无理数

二:博客

例11 求凸包

水平排序,做一次上凸壳,做一次下凸壳

例12 求凸包直径

旋转卡壳

例13 给出平面上n个点,求最近点对

KD-T ≈ 分治

例 14 圆的位置关系(+求交点)

随便做

例 15 点到圆的切点

运用反三角函数计算

例16 圆圆切线

同上

例17 求圆和多边形交的面积

。。

例18 最小圆覆盖

随机增量算法

例19 BZOJ 1043: [HAOI2008]下落的圆盘

暴力枚举后面呢,求区间并

例20 CF 932F Escape Through Leaf

启发式合并/DSU on tree 维护凸包

例21 Directions

给出若干向量,每个向量有代价,选取最小代价的向量让它们通过乘上非负整数后线性组合能够组合出任意向量。

n 2e5

最多选4个,当且仅当四个方向呈十字架才会选4个,否则选3个。

把向量反向得到的向量记作白色,原来的向量记作黒色。

4个的随便做

要选3个就是要找一个角范围<= π \pi π 的黑白黑三个向量,枚举第一个黒色向量,另外一个黑色向量单调的动,也就是two-pointers,然后线段树查询(貌似可以直接左右端点动的时候count)区间内有无白点。

例22 CF 1025F Disjoint Triangles

求以给出的n个点为顶点的不相交的三角形的对数

如果两个三角形不相交,那么一定存在两条内公切线。

那么我们就可以枚举内公切线了。

对于输入的每一个点,我们让它和其他n-1个点组成直线,并进行极角排序,然后逆时针方向枚举这些直线,同时维护在直线右侧的点的数量,对于每一条直线,利用乘法原理计算方案。

还有一些小细节:每一条直线实际上可以组成两个三角形。如上图中,直线CE既可以组成 △ A B C \triangle ABC ABC △ D E F \triangle DEF DEF,也可以组成 △ A B E \triangle ABE ABE △ C D F \triangle CDF CDF。所以每次计算的时候要乘2。但是每一个三角形又会被两条直线同时计算,所以最后答案又要减半,那么实际上就完全抵消了。

同时,我们只枚举极角小于0的直线,防止共线的情况算重。

例23 共点圆 BZOJ 2961

n次操作,每次要么加入一个过原点的圆,要么询问一个(x,y)是否在所有圆的内部。

n <= 5e5

圆的反演->动态半平面交(离线CDQ分治可解决)

例24 HDU4773 Problem of Apollonius

给两个不相交的圆,给一个点不在这两个圆上,求过这个点且与这两个圆外切的所有圆。

博客naturepengchen

博客ACdreamer

博客flipped

反演后所求圆变成公切线,求出来后再反演回去。

例25 CodeChef QPOINT Queries With Points

给出二维平面上n个不相交的多边形,强制在线,q组询问,给出一个点问它在哪个多边形内,或者不在一个多边形内。

n,q <= 1e5, 点数和 <= 3e5

离线后点定位

在线就可持久化Treap

不会。

例26 CF704E Iron Man

树链剖分后移动的dfs连续,时间看作x,dfs序编号看作y,移动就变成了线段,所以即求最早出现两线段相交,然后x扫描线,y用set维护。因为在没有线段相交之前,相对顺序是不变的。相交的两个肯定是set中相邻的两个,所以插入删除时check一下就行了。

例27 CF799G Cut the pie

f(x) 表示极角为 x 的射线左侧的面积减去右侧的面积。有 f(0) = f(π)。连续函数介值定理,必存在零点。于是二分零点就行了。问题变成了如何计算 f(x)。

考虑对叉积计算前缀和,本质上是对凸多边形求了个三角剖分。二分出卡在凸包的哪两条边上,不妨设原点不在射线所求的一侧,则面积就是一段连续的叉积减一个三角形加两个三角形。

O(1) 即可算出。复杂度 O(nlog n)。

Day_6 微积分在计算几何中的应用

偏 导 数 \Large 偏导数

​ 定义:设函数 u = f ( x ) = f ( x 1 , x 2 , . . . , x n ) 在 区 域 D ⊂ R n u=f(x)=f(x_1,x_2,...,x_n)在区域D\sub \R^n u=f(x)=f(x1,x2,...,xn)DRn上有定义, x 0 = ( x 1 0 , x 2 0 . . . x n 0 ) ∈ D x_0=(x_1^0,x_2^0...x_n^0)\in D x0=(x10,x20...xn0)D。对于 1 ≤ i ≤ n 1\le i\le n 1in,若一元函数 f ( x 1 0 , . . . , x i − 1 0 , x i , x i + 1 0 , . . . , x n 0 ) f(x_1^0,...,x_{i-1}^0,x_i,x_{i+1}^0,...,x_n^0) f(x10,...,xi10,xi,xi+10,...,xn0) x i 0 x_i^0 xi0处的导数,即 lim ⁡ x i → x i 0 f ( x 1 0 , . . . , x i − 1 0 , x i , x i + 1 0 , . . . , x n 0 ) − f ( x 1 0 , x 2 0 . . . x n 0 ) x i − x i 0 \lim_{x_i\to x_i^0}\frac{f(x_1^0,...,x_{i-1}^0,x_i,x_{i+1}^0,...,x_n^0)-f(x_1^0,x_2^0...x_n^0)}{x_i-x_i^0} limxixi0xixi0f(x10,...,xi10,xi,xi+10,...,xn0)f(x10,x20...xn0)存在,则称 f ( x ) f(\textbf{x}) f(x) x 0 \textbf{x}_0 x0处关于 x i x_i xi可偏导,并称上述极限为 f ( x ) f(\textbf{x}) f(x) x 0 \textbf{x}_0 x0处关于 x i x_i xi偏导数,记为 ∂ f ( x 0 ) x i , f x i ′ ( x 0 ) , ∂ u ∂ x i ∣ x 0 \frac{∂f(\textbf{x}_0)}{x_i},f'_{x_i}(\textbf{x}_0),\left.\frac{∂u}{∂x_i}\right|_{\textbf{x}_0} xif(x0),fxi(x0),xiux0等。

重 积 分 与 累 次 积 分 \Large 重积分与累次积分

​ 直观理解:n维空间中每个点有个函数值,将一个区域分得足够细,每一部分里取值加起来。

​ 二重积分: ∬ D f ( x , y ) d x d y \iint_Df(x,y)dxdy Df(x,y)dxdy

​ 三重积分: ∭ D f ( x , y , z ) d x d y d z \iiint_Df(x,y,z)dxdydz Df(x,y,z)dxdydz

f f f取1时积的就是面积(体积)。

​ 二维时若 f f f表示“高度”,则积出来就是体积。

曲 线 积 分 \Large 曲线积分 线

​ 直观理解:把曲线分成若干段,每段上取点求函数加起来,分得足够细时值的极限。

​ 分为第一型曲线积分和第二型曲线积分,第一型不带方向,第二型带方向。

​ 计算一般都是把曲线参数化,然后求一个一元定积分。

求 闭 合 曲 线 围 成 的 封 闭 图 形 的 面 积 \Large 求闭合曲线围成的封闭图形的面积 线

​ 设 Γ \Gamma Γ是一条封闭曲线,则其围成的面积为:

∮ Γ + x d y = − ∮ Γ + y d x = 1 2 ∮ Γ + ( x d y − y d x ) \oint_{\Gamma^+}xdy=-\oint_{\Gamma^+}ydx=\frac 12\oint_{\Gamma^+}(xdy-ydx) Γ+xdy=Γ+ydx=21Γ+(xdyydx)

​ (证明?)

​ 本质上是格林公式。

​ 简单例子:圆,正方形…

多 元 函 数 的 极 值 \Large 多元函数的极值

​ 驻点:导数为0的点

​ 极值点一定是驻点,驻点不一定是极值点(可能是鞍点,如 y 2 − x 2 y^2-x^2 y2x2 ( 0 , 0 ) (0,0) (0,0)处)。

​ 要求一个问题的极值点,可以把驻点、边界点、不可导点都拿出来check以下。

  • 例:某工厂生产一批长方体无盖盒子,要求其体积为1m^3,盒子的底厚度是侧面厚度的三倍,问:如何设定盒子的长宽高才能使得用料最省。

  • 解:设长宽高分别为 x , y , z x,y,z x,y,z。设 F ( x , y , z ) = 3 x y + 2 y z + 2 x z F(x,y,z)=3xy+2yz+2xz F(x,y,z)=3xy+2yz+2xz

    ​ 由于体积为 1 1 1,即 x y z = 1 xyz=1 xyz=1,设 S ( x , y ) = 3 x y + 2 ( 1 x + 1 y ) S(x,y)=3xy+2(\frac 1x+\frac 1y) S(x,y)=3xy+2(x1+y1),则变成求 S ( x , y ) S(x,y) S(x,y)的最小值。求 驻点: ∂ S ( x , y ) ∂ x = 3 y − 2 x 2 = 0 , ∂ S ( x , y ) ∂ y = 3 x − 2 y 2 = 0 \frac{∂S(x,y)}{∂x}=3y-\frac2{x^2}=0,\frac{∂S(x,y)}{∂y}=3x-\frac 2{y^2}=0 xS(x,y)=3yx22=0,yS(x,y)=3xy22=0

    ​ 解得 x = y = 2 3 3 x=y=\sqrt[3]{\frac 23} x=y=332 ,由于实际问题总存在最小值,且这是唯一的驻点,所以 S ( x , y ) S(x,y) S(x,y)必在此点 取最小值。

拉 格 朗 日 乘 数 法 \Large 拉格朗日乘数法

​ 设 Γ \Gamma Γ是一条曲线,要求它到原点得最短距离。

​ 为解决此问题,可设 F ( x , y , z ) = x 2 + y 2 + z 2 F(x,y,z)=x^2+y^2+z^2 F(x,y,z)=x2+y2+z2,表示一个点到原点距离的平方。于是问题转化为:当 ( x , y , z ) (x,y,z) (x,y,z) Γ \Gamma Γ上变化时, F ( x , y , z ) F(x,y,z) F(x,y,z)的最小值。这种外加约束的极值问题称为条件极值问题

​ 设要求极值的函数为 f ( x ) f(x) f(x),约束条件为 ϕ j ( x ) = 0 , j = 1.. m \phi_j(x)=0,j=1..m ϕj(x)=0,j=1..m。则构造函数:

F ( x 1 , . . . , x n , λ 1 , . . . , λ m ) = f ( x ) + ∑ j = 1 m λ j ϕ j ( x ) F(x_1,...,x_n,\lambda_1,...,\lambda_m)=f(\textbf{x})+\sum_{j=1}^m\lambda_j\phi_j(\textbf{x}) F(x1,...,xn,λ1,...,λm)=f(x)+j=1mλjϕj(x)

​ 条件极值的必要条件形式上化为 F F F的通常极值的必要条件:

{ ∂ F ( x 0 ) ∂ x i = 0 ( i = 1 , 2 , . . . , n ) ∂ F ( x 0 ) ∂ λ j = 0 ( j = 1 , 2 , . . . , m ) \begin{cases}\frac{∂F(x_0)}{∂x_i}=0(i=1,2,...,n)\\\frac{∂F(x_0)}{∂\lambda_j}=0(j=1,2,...,m)\end{cases} {xiF(x0)=0(i=1,2,...,n)λjF(x0)=0(j=1,2,...,m)

  • 例:求椭球面16x2+4y2+9z^2=144内接且各面均平行于坐标平面的长方体的最大体积。

    解:设 ( x , y , z ) (x,y,z) (x,y,z)为椭球面内接长方体在第一象限的顶点坐标,由对称性长方形体积为

    V = f ( x , y , z ) = 8 x y z V=f(x,y,z)=8xyz V=f(x,y,z)=8xyz

    ​ 所求最大体积变成了 f ( x , y , z ) f(x,y,z) f(x,y,z)在约束条件

    g ( x , y , z ) = 16 x 2 + 4 y 2 + 9 z 2 − 144 = 0 g(x,y,z)=16x^2+4y^2+9z^2-144=0 g(x,y,z)=16x2+4y2+9z2144=0

    ​ 下的最大值。

    ​ 由拉格朗日乘数法,作函数

    F ( x , y , z , λ ) = f ( x , y , z ) + λ g ( x , y , z ) F(x,y,z, λ)=f(x,y,z)+λg(x,y,z) F(x,y,z,λ)=f(x,y,z)+λg(x,y,z)

    ​ 求其各个偏导数得方程组

    { 8 y z + 32 λ x = 0 8 x z + 8 λ y = 0 8 x y + 18 λ z = 0 16 x 2 + 4 y 2 + 9 z 2 − 144 = 0 \begin{cases}8yz+32λx=0\\8xz+8λy=0\\8xy+18λz=0\\16x^2+4y^2+9z^2-144=0\end{cases} 8yz+32λx=08xz+8λy=08xy+18λz=016x2+4y2+9z2144=0

    ​ 解出来判掉不合法情况得 x = 3 , y = 2 3 , z = 4 3 3 x=\sqrt{3},y=2\sqrt3,z=\frac{4\sqrt3}3 x=3 ,y=23 ,z=343 ,于是

    V m a x = 8 × 3 × 2 3 × 4 3 3 = 64 3 V_{max}=8×\sqrt3×2\sqrt3×\frac{4\sqrt3}3=64\sqrt3 Vmax=8×3 ×23 ×343 =643

R 3 中 曲 线 Γ 的 切 线 、 法 平 面 \Large \R^3中曲线\Gamma的切线、法平面 R3线Γ线

​ 略

R 3 \Large \R^3 R3中曲面 S \Large S S上切平面、法线

​ 略

Day_6 杂题选讲

例1 Binary Cards CF #469 E

给出n个需要表示的数,你需要用最小的2k或-2k,使得能拼出所有需要表示的数。输出方案。

n,|Ai| <= 100000

​ 相同的数不会选过两次,因为两个2不如一个4优

​ -2和2不会同时选,因为不如选2和-4 或者 4和-2

​ 考虑缩小问题规模,如果全是偶数就除以二,如果有奇数就必选1/-1,暴力枚举然后报搜下去,每一层都把数字去个重。

​ 这样第k层数字个数不会超过 O ( A i 2 k ) O(\frac{Ai}{2^k}) O(2kAi)。总的时间复杂度即为 O ( ( n + A i ) l o g   n ) O((n+A_i)log\ n) O((n+Ai)log n)

例2 不上升序列 hihoCoder 挑战赛29 D

整数序列A,每次可以花费1的代价让某个数+1或-1,求最少代价让其变成一个不上升序列

​ 假设求的是不降序列,不升同理。设 f ( x ) f(x) f(x)表示最后一个数 ≤ x \le x x的最优答案,由于每次加的代价都是线性的,它显然形如一条每段斜率都是整数的折线。

​ 在最右边加入一个值 A A A时,将 f ( x ) f(x) f(x)加上 ∣ x − A ∣ |x-A| xA,再对 f ( x − 1 ) f(x-1) f(x1)取一个 m i n min min

​ 两个这种形状的折线相加时,只要把拐点直接取个并就行了。

f ( x ) = m i n ( f ( x ) , f ( x − 1 ) ) f(x)=min(f(x),f(x-1)) f(x)=min(f(x),f(x1))显然就是把折线最右边斜率>=1的部分都删去。

​ 那么具体的算法就是,每次插入两个拐点,再把最大的拐点删掉。用一个大根堆维护拐点的横坐标就行了。最后用 f ( 0 ) = ∑ ∣ A i ∣ f(0)=\sum|Ai| f(0)=Ai来还原出纵坐标即答案

​ ?

例3 Sum of Powers CS Academy # 32 G

考虑所有的正整数可重集{a1,a2,a3,…,ak},满足a1+a2+…+ak=n,求所有a1m+a2m+…+ak^m的和。 n,m,k <= 4096

​ 设 f ( i , j ) f(i,j) f(i,j)表示 i i i个物品和为 j j j的方案数。转移要么放一个 1 1 1,要么把所有物品都 + 1 +1 +1

f ( i , j ) → f ( i + 1 , j + 1 ) f ( i , j ) → f ( i , j + i ) f(i,j)\to f(i+1,j+1)\\f(i,j)\to f(i,j+i) f(i,j)f(i+1,j+1)f(i,j)f(i,j+i)

​ 考虑 x m x^m xm变成 x m + 1 x^{m+1} xm+1,对于所有 0 ≤ i ≤ m 0\le i\le m 0im维护 ∑ x i \sum x^i xi,乘组合数转移,复杂度 O ( n 4 ) O(n^4) O(n4)

​ 如果维护 x m ‾ x^{\underline{m}} xm,有 ( x + 1 ) m ‾ = x m ‾ + m x m − 1 ‾ (x+1)^{\underline{m}}=x^{\underline m}+mx^{\underline{m-1}} (x+1)m=xm+mxm1,用第二类斯特林数还原出答案, O ( n 3 ) O(n^3) O(n3)

​ 但是这些都太慢了

​ 考虑算每个东西对答案的贡献。体积为 i i i的东西贡献到的次数是

∑ j = 1 ∞ [ 包 含 至 少 \sum_{j=1}^{\infty}[包含至少 j=1[j 个 个 i 的 方 案 数 ] 的方案数] ]

​ 也就是

∑ j = 1 ∞ f ( k − j , n − i j ) \sum_{j=1}^{\infty}f(k-j,n-ij) j=1f(kj,nij)

O ( n 2 ) O(n^2) O(n2)

例4 THUPC 2017 I 小L的计算题

给出A1~An,设 Fk = sigma_{i=1…n}Ai^k

求F1~Fn 模998244353

n,k <= 200000, Ai <= 1e9

​ 牛顿恒等式:对于一个首一多项式 F ( x ) = ∑ i = 0 n C n − i x i   ( C 0 = 1 ) F(x)=\sum_{i=0}^nC_{n-i}x^i\ (C_0=1) F(x)=i=0nCnixi (C0=1),设 P i P_i Pi表示它的 n n n个根的 i i i次方和,对于所有正整数 d d d,有等式:

∑ i = 0 d − 1 C i P d − i + C d ⋅ d \sum_{i=0}^{d-1}C_iP_{d-i}+C_d\cdot d i=0d1CiPdi+Cdd

​ 知道 C C C P P P:多项式求逆, O ( n log ⁡ n ) O(n\log n) O(nlogn)

​ 知道 P P P C C C:多项式exp, O ( n log ⁡ n ) O(n\log n) O(nlogn)

​ 这题把 A 1... n A_{1...n} A1...n想象成一个多项式的 n n n个根,要求所有根的 k k k次方和,即 P P P

​ 分治 F F T FFT FFT展开 ∏ i = 1 n ( x − A i ) \prod_{i=1}^n(x-A_i) i=1n(xAi)得到 C C C,多项式求逆得出 P P P即可。

例5 星空 by 杨家齐

在n个点之间给出m条带权无向边,权值是[0,p=17),问有多少种方案选择一些边(不选重边),使得整张图连通,并且边权和为x?对于x ∈ \in [0,p)都要求答案。

n <= 17,m <= 1e5。复杂度为 O ( 2 n n 2 p ) O(2^nn^2p) O(2nn2p)

skip

例6 FindingFriends SRM 702 1000pts

给出n个数Ai,定义一个区间是k-快乐的当且仅当对于区间内每个数,都能找到区间内另一个数和它差不超过k。给出m,求最小的k使得存在一个长度>=m的k-快乐区间。

n,m <= 1e5

​ 二分答案,用个数据结构搞出每个数左右第一个和它差不超过k的位置,设为 L i L_i Li R i R_i Ri

​ 现在相当于求:是否存在一个区间 [ l , r ] [l,r] [l,r]使得 ∀ l ≤ i ≤ r \forall l\le i\le r lir,要么 L i ≥ l L_i\ge l Lil要么 R i ≤ r R_i\le r Rir

​ 设函数 S o l v e ( l , r ) Solve(l,r) Solve(l,r)表示是否有 [ l , r ] [l,r] [l,r]的子区间满足条件。

​ 如果 r − l + 1 > m r-l+1>m rl+1>m,返回 0 0 0.

​ 如果有一个 i i i满足 L i < l L_i<l Li<l R i > r R_i>r Ri>r,那么这个点是萎的,不能包含,变成两个子问题 S o l v e ( l , i − 1 ) Solve(l,i-1) Solve(l,i1) S o l v e ( i + 1 , r ) Solve(i+1,r) Solve(i+1,r)

​ 如何找到这样的 i i i呢?如果从左往右找,显然是 O ( n 2 ) O(n^2) O(n2)的。

​ 考虑从两边同时往中间扫,扫到就 b r e a k break break

T ( n ) = T ( i ) + T ( n − i ) + O ( m i n ( i , n − i ) ) → T ( n ) = O ( n log ⁡ n ) T(n)=T(i)+T(n-i)+O(min(i,n-i))\\ \to T(n)=O(n\log n) T(n)=T(i)+T(ni)+O(min(i,ni))T(n)=O(nlogn)

例7 CoinsQuery SRM 713 900pts

有n种物品,单个重量为wi,价值为vi,每种物品都有无限多个。有q个询问:在所有拼出重量恰好为m的方案中,价值和最大的是多少?达到最大价值的方案有多少种?(A,A,B)和(A,B,A)被视为两种不同的方案。

n,q,wi <= 100,m,vi <= 1e9

( A , A , B ) (A,A,B) (A,A,B) ( A , B , A ) (A,B,A) (A,B,A)视为不同方案?

f ( i ) = max ⁡ f ( i − w j ) + v j f(i)=\max f(i-w_j)+v_j f(i)=maxf(iwj)+vj

​ 注意到重量都不超过100,假如用一个向量存 f ( i − 100 ) , . . . , f ( i ) f(i-100),...,f(i) f(i100),...,f(i),用加法定义乘法,用 max ⁡ \max max定义加法,矩乘! O ( q ⋅ n 3 log ⁡ m ) O(q\cdot n^3\log m) O(qn3logm)

​ 注意到对于不同的 m m m,转移矩阵都是一样的,预处理转移矩阵的2的多少次方,询问时倍增。倍增的时候变成向量乘矩阵,而不是矩阵乘矩阵。 O ( n 3 log ⁡ m + q ⋅ n 2 l o g m ) O(n^3\log m+q\cdot n^2logm) O(n3logm+qn2logm)

例8 Test Data Generation VK Cup 2017 Round 3 F

给出A,N,p,要对于所有u,求从1~ ⌊ A 2 u ⌋ \lfloor{\frac A{2^u}}\rfloor 2uA中选n个数, 1 ≤ n ≤ N 1\le n\le N 1nN且n是奇数,还要满足选出的最大数是奇数,这样的方案数。求和。模p。

A <= 1e9, N <= 30000, q = O(1e5) 5秒

​ 如果枚举最大的数的话,就算是一些 n n n很大 m m m不大的组合数。

​ 组合数是可以分治的。

( n m ) = ∑ i = 0 m ( a i ) ( n − a m − i ) \binom{n}{m}=\sum_{i=0}^m\binom ai\binom{n-a}{m-i} (mn)=i=0m(ia)(mina)

​ 应用到这题里就是把 A A A个数对半划开,变成求 ⌊ A 2 ⌋ \lfloor\frac{A}{2}\rfloor 2A个数中选 n n n个的方案数,然后 F F T FFT FFT合并。

​ 由于每次都是除 2 2 2下取整,所以一次就能把所有 u u u的答案都算出来。

​ 复杂度 O ( n log ⁡ n log ⁡ A ) O(n\log n\log A) O(nlognlogA)

例8 PreInPost SRM 715 1000pts

给出 s[0*…*5],每个都是“前”“中”或者“后”之一。

有一棵二叉树。定义 dfs(x, mode),mode 表示是前序、中序还是后序遍历。这个过程返回遍历 x 这棵树的结果,只不过递归左右儿子时的 mode 会改成 s[mode 2] 和 s[mode 2 + 1]。

给出对于一棵二叉树的两种遍历结果,求一种它可能的第三种遍历结果。

n <= 200

​ 设 f ( x , y , a , b , i ) f(x,y,a,b,i) f(x,y,a,b,i)表示第一个序列 [ a , a + i ) [a,a+i) [a,a+i),遍历方法为 x x x,第二个序列 [ b , b + i ) [b,b+i) [b,b+i),遍历方法为 y y y,是否可能是一棵合法二叉树。

​ 如果两个遍历方法相同,直接看两个串是否完全相同即可。

​ 如果其中一个是中序遍历,可以递归成子问题。

​ 若果一个是前序遍历一个是后序遍历,需要美剧一个左右子树的分界线。

​ 乍一看复杂度好像是 O ( n 4 ) O(n^4) O(n4),实际上,可能合法的 ( a , b , i ) (a,b,i) (a,b,i)状态只有 O ( n 2 ) O(n^2) O(n2)个:第一个序列中选一个区间,第二个序列中只可能有一个区间包含且仅包含这些数。所以总复杂度是 O ( n 3 ) O(n^3) O(n3)

​ ?

例9 Game Revisited Codechef SNCKEL17

一张n个点m条边的无向图,每条边有个编号。

现在q次操作,每次会交换两条边的编号,然后回答:按编号从小到大加入便,加到整张图联通时编号是多少?

n,q <= 100000

​ 把编号看成边权,相当于:修改两条边的边权,询问最小生成树的最大边。

​ 这个问题是经典问题,有两种做法。

​ 1.考虑每一条边出现的时间是一个区间,用时间线段树维护,这样就只有加边了。最小生成树用LCT来维护即可。复杂度 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n)

​ 2.还有一种基于分治的“R-C”算法。

​ 设 W o r k ( l , r ) Work(l,r) Work(l,r)处理 [ l , r ] [l,r] [l,r]之间之间的修改,并回答每次修改完的答案。

​ Reduction:把修改涉及到的边设为 ∞ \infty ,跑最小生成树,不在其中的边肯定没有用了,直接删掉,做完这一步边数变成了O(点数)

​ Contraction:把修改涉及到的边设为 − ∞ -\infty ,跑最最小生成树,还在其中的边必定会在最后的答案中,直接把两侧的点缩起来。这一步做完点数变成了O(R-L)

​ 递归做下去即可。每一层要对边排序,复杂度 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

例10 母亲节的礼物 THUPC 2017 D

n 个点,m 条边的无向简单图,每个点最多和 7 个点相邻。

给点四染色,要求每个点最多有一个邻居和它颜色相同。

输出方案或输无解。

n <= 25000, m <= 100000

​ 先随机一个初始解,然后调整。

​ 找一个萎掉的点(它邻居中至少 2 个和它颜色相同),由 于度数不超过 7,它一定能换成一种只出现不超过 1 次的颜色。

​ 用个队列模拟这个过程。

​ 每次调整后,两端颜色相同的边都会减少,因此这个算法总能结束,且复杂度是 O(m) 的。

Day_7 分治 离线

Day_7 DP入门?

例1 LOJ6395 「THUPC2018」城市地铁规划 / City

https://www.cnblogs.com/onioncyc/p/9052946.html

https://blog.csdn.net/alan_cty/article/details/80426382

例2 LOJ2552「CTSC2018」假面

https://blog.csdn.net/icefox_zhx/article/details/80246001

例3 CF 53E Dead Ends

n个点的图,求有多少生成树使得恰好有k个叶子。

n<=15

枚举叶子集合,剩下的矩阵树,把叶子接上去。子集容斥FMT/FWT

例4 UOJ#129 NOI 2015 寿司晚宴 luogu分2150

2…n一共n-1个数,两人别取一个子集S、T,要求不存在x ∈ \in S,y ∈ \in T,使得gcd(x,y)$\neq$1

x 2 ≤ 500 x^2\le500 x2500的质数只有8个,枚举小质数状态,剩下的DP。。?

例5 UOJ#266 Alice 和 Bob 又在玩游戏

给定一个n个点的有根森林,两人轮流选择一个点,并将这个点及其祖先全部删掉,并保留其祖先后代关系。不能操作者输,求谁胜。 T <= 10, n <= 1e5

SG函数

例6 AGC007D - Shik and Game

数轴上有n只熊,第i只位置在xi

现在你要从位置0走到位置E,你有n颗糖,你要喂给每只熊一颗,某只熊如果在t时刻吃了糖,就会在t+T时刻吐出一个硬币,你的速度是1单位每秒,求收集所有硬币并走到终点的时间。

n <= 1e5 xi <= E

DP分类优化, O ( n ) O(n) O(n)

例7 BZOJ - [Poi2011]Lightning Conductor

给定一个序列ai,对于每一个i,找一个最小的p,满足对所有j有: p ≥ a j − a i + ∣ i − j ∣ p\ge a_j-a_i+\sqrt{|i-j|} pajai+ij

n <= 1e6

决策点调性

根号特性:值越大变化率越小

所以:当一个数比你靠后且算出来的值比你大,你就没用了。

例8 LOJ #566. 「LibreOJ Round #10」yanQval 的生成树

最大离差生成树。

https://www.cnblogs.com/zjp-shadow/p/9502359.html

凸优化

例9 LOJ 565.「LibreOJ Round #10」mathematican 的二进制

​ 答案与操作顺序无关

明天开始模拟赛,人没了。

你可能感兴趣的:(总结)