Day_6 计算几何

点积\Large 点积点积

叉积\Large 叉积叉积

极角\Large 极角极角

< π\piπ :叉积判断

else :atan2

旋转\Large 旋转旋转

左乘第一类正交矩阵

[cos θ−sin θsin θcos θ][cos ωsin ω]=[cos θ cos ω−sin θ sin ωsin θ cos ω+cos θ sin ω]=[cos(θ+ω)sin(θ+ω)]\left[ \begin{array}{} cos\ \theta &amp; -sin\ \theta \\ sin\ \theta&amp;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 反射反射

左乘第二类正交矩阵

[cos θsin θsin θ−cos θ][cos ωsin ω]=[cos θ cos ω+sin θ sin ωsin θ cos ω−cos θ sin ω]=[cos(θ−ω)sin(θ−ω)]\left[ \begin{array}{} cos\ \theta &amp; sin\ \theta \\ sin\ \theta&amp;-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既可以组成△ABC\triangle ABC△ABC和△DEF\triangle DEF△DEF,也可以组成△ABE\triangle ABE△ABE和△CDF\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(x1,x2,...,xn)在区域D⊂Rnu=f(x)=f(x_1,x_2,...,x_n)在区域D\sub \R^nu=f(x)=f(x1​,x2​,...,xn​)在区域D⊂Rn上有定义,x0=(x10,x20...xn0)∈Dx_0=(x_1^0,x_2^0...x_n^0)\in Dx0​=(x10​,x20​...xn0​)∈D。对于1≤i≤n1\le i\le n1≤i≤n,若一元函数f(x10,...,xi−10,xi,xi+10,...,xn0)f(x_1^0,...,x_{i-1}^0,x_i,x_{i+1}^0,...,x_n^0)f(x10​,...,xi−10​,xi​,xi+10​,...,xn0​)在xi0x_i^0xi0​处的导数,即lim⁡xi→xi0f(x10,...,xi−10,xi,xi+10,...,xn0)−f(x10,x20...xn0)xi−xi0\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}limxi​→xi0​​xi​−xi0​f(x10​,...,xi−10​,xi​,xi+10​,...,xn0​)−f(x10​,x20​...xn0​)​存在,则称f(x)f(\textbf{x})f(x)在x0\textbf{x}_0x0​处关于xix_ixi​可偏导,并称上述极限为f(x)f(\textbf{x})f(x)在x0\textbf{x}_0x0​处关于xix_ixi​的偏导数,记为∂f(x0)xi,fxi′(x0),∂u∂xi∣x0\frac{∂f(\textbf{x}_0)}{x_i},f'_{x_i}(\textbf{x}_0),\left.\frac{∂u}{∂x_i}\right|_{\textbf{x}_0}xi​∂f(x0​)​,fxi​′​(x0​),∂xi​∂u​∣∣∣​x0​​等。

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

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

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

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

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

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

曲线积分\Large 曲线积分曲线积分

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

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

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

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

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

​ ∮Γ+xdy=−∮Γ+ydx=12∮Γ+(xdy−ydx)\oint_{\Gamma^+}xdy=-\oint_{\Gamma^+}ydx=\frac 12\oint_{\Gamma^+}(xdy-ydx)∮Γ+​xdy=−∮Γ+​ydx=21​∮Γ+​(xdy−ydx)

​ (证明?)

​ 本质上是格林公式。

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

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

​ 驻点:导数为0的点

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

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

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

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

    ​ 由于体积为111,即xyz=1xyz=1xyz=1,设S(x,y)=3xy+2(1x+1y)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=3y−2x2=0,∂S(x,y)∂y=3x−2y2=0\frac{∂S(x,y)}{∂x}=3y-\frac2{x^2}=0,\frac{∂S(x,y)}{∂y}=3x-\frac 2{y^2}=0∂x∂S(x,y)​=3y−x22​=0,∂y∂S(x,y)​=3x−y22​=0

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

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

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

​ 为解决此问题,可设F(x,y,z)=x2+y2+z2F(x,y,z)=x^2+y^2+z^2F(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(x1,...,xn,λ1,...,λm)=f(x)+∑j=1mλ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)

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

​ {∂F(x0)∂xi=0(i=1,2,...,n)∂F(x0)∂λ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}{∂xi​∂F(x0​)​=0(i=1,2,...,n)∂λj​∂F(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)=8xyzV=f(x,y,z)=8xyzV=f(x,y,z)=8xyz

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

    ​ g(x,y,z)=16x2+4y2+9z2−144=0g(x,y,z)=16x^2+4y^2+9z^2-144=0g(x,y,z)=16x2+4y2+9z2−144=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)

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

    ​ {8yz+32λx=08xz+8λy=08xy+18λz=016x2+4y2+9z2−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+9z2−144=0​

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

    ​ Vmax=8×3×23×433=643V_{max}=8×\sqrt3×2\sqrt3×\frac{4\sqrt3}3=64\sqrt3Vmax​=8×3​×23​×343​​=643​

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

​ 略

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

​ 略

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(Ai2k)O(\frac{Ai}{2^k})O(2kAi​)。总的时间复杂度即为O((n+Ai)log 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的最优答案,由于每次加的代价都是线性的,它显然形如一条每段斜率都是整数的折线。

​ 在最右边加入一个值AAA时,将f(x)f(x)f(x)加上∣x−A∣|x-A|∣x−A∣,再对f(x−1)f(x-1)f(x−1)取一个minminmin。

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

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

​ 那么具体的算法就是,每次插入两个拐点,再把最大的拐点删掉。用一个大根堆维护拐点的横坐标就行了。最后用f(0)=∑∣Ai∣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)表示iii个物品和为jjj的方案数。转移要么放一个111,要么把所有物品都+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)

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

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

​ 但是这些都太慢了

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

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

​ 也就是

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

​ O(n2)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=0nCn−ixi (C0=1)F(x)=\sum_{i=0}^nC_{n-i}x^i\ (C_0=1)F(x)=∑i=0n​Cn−i​xi (C0​=1),设PiP_iPi​表示它的nnn个根的iii次方和,对于所有正整数ddd,有等式:

​ ∑i=0d−1CiPd−i+Cd⋅d\sum_{i=0}^{d-1}C_iP_{d-i}+C_d\cdot d∑i=0d−1​Ci​Pd−i​+Cd​⋅d

​ 知道CCC求PPP:多项式求逆,O(nlog⁡n)O(n\log n)O(nlogn)

​ 知道PPP求CCC:多项式exp,O(nlog⁡n)O(n\log n)O(nlogn)

​ 这题把A1...nA_{1...n}A1...n​想象成一个多项式的nnn个根,要求所有根的kkk次方和,即PPP。

​ 分治FFTFFTFFT展开∏i=1n(x−Ai)\prod_{i=1}^n(x-A_i)∏i=1n​(x−Ai​)得到CCC,多项式求逆得出PPP即可。

例5 星空 by 杨家齐

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

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

skip

例6 FindingFriends SRM 702 1000pts

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

n,m <= 1e5

​ 二分答案,用个数据结构搞出每个数左右第一个和它差不超过k的位置,设为LiL_iLi​和RiR_iRi​。

​ 现在相当于求:是否存在一个区间[l,r][l,r][l,r]使得∀l≤i≤r\forall l\le i\le r∀l≤i≤r,要么Li≥lL_i\ge lLi​≥l要么Ri≤rR_i\le rRi​≤r。

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

​ 如果r−l+1&gt;mr-l+1&gt;mr−l+1>m,返回000.

​ 如果有一个iii满足Li&lt;lL_i&lt;lLi​<l且Ri&gt;rR_i&gt;rRi​>r,那么这个点是萎的,不能包含,变成两个子问题Solve(l,i−1)Solve(l,i-1)Solve(l,i−1)和Solve(i+1,r)Solve(i+1,r)Solve(i+1,r)。

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

​ 考虑从两边同时往中间扫,扫到就breakbreakbreak。

​ T(n)=T(i)+T(n−i)+O(min(i,n−i))→T(n)=O(nlog⁡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(n−i)+O(min(i,n−i))→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−wj)+vjf(i)=\max f(i-w_j)+v_jf(i)=maxf(i−wj​)+vj​

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

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

例8 Test Data Generation VK Cup 2017 Round 3 F

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

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

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

​ 组合数是可以分治的。

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

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

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

​ 复杂度O(nlog⁡nlog⁡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),遍历方法为xxx,第二个序列[b,b+i)[b,b+i)[b,b+i),遍历方法为yyy,是否可能是一棵合法二叉树。

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

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

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

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

​ ?

例9 Game Revisited Codechef SNCKEL17

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

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

n,q <= 100000

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

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

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

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

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

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

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

​ 递归做下去即可。每一层要对边排序,复杂度O(nlog⁡2n)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

x2≤500x^2\le500x2≤500的质数只有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≥aj−ai+∣i−j∣p\ge a_j-a_i+\sqrt{|i-j|}p≥aj​−ai​+∣i−j∣​

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 的二进制

​ 答案与操作顺序无关

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

zhengrui集训笔记2的更多相关文章

  1. zhengrui集训D1-D5笔记

    Day_1 计数 它咕掉了 Day_1 序列数据结构 它咕掉了 Day_2 线性代数 高斯消元\Large{高斯消元}高斯消元 普通版:略 模质数:求逆 模合数:exgcd 逆矩阵\Large{逆矩阵 ...

  2. QDEZ集训笔记【更新中】

    这是一个绝妙的比喻,如果青岛二中的台阶上每级站一只平度一中的猫,差不多站满了吧 自己的理解 [2016-12-31] [主席树] http://www.cnblogs.com/candy99/p/61 ...

  3. 2017清北学堂(提高组精英班)集训笔记——动态规划Part3

    现在是晚上十二点半,好累(无奈脸),接着给各位——也是给自己,更新笔记吧~ 序列型状态划分: 经典例题:乘积最大(Luogu 1018) * 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它 ...

  4. [英语学习]微软面试前英语集训笔记-day 1

    最近有机会参加微软面试前的英语集训. 第一天是由wendy老师主讲.热场题目是介绍你自己.包括你的姓名,家庭hobby,爱好,专业,学校,工作经历等等. 接下来的主题是friendship.给我印象较 ...

  5. 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147

    以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...

  6. 【集训笔记】母函数【母函数模板】【HDOJ1028【HDOJ1085

    以下资料摘自 http://www.cnblogs.com/wally/archive/2012/07/13/hdu1028_1085_1171_.html 生成函数是说,构造这么一个多项式函数g(x ...

  7. 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...

  8. 【集训笔记】动态规划背包问题【HDOJ1421【HDOJ1058【HDOJ2546

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 http://acm.zju.edu.cn/onlinejudge/showContestProblem. ...

  9. 【集训笔记】动态规划【HDOJ1159【HDOJ1003

    终于开始DP了] HDOJ_1159  Common  Subsequence 题目链接 Sample Input abcfbc abfcab programming contest abcd mnp ...

随机推荐

  1. javaIO -- InputStream和OutStream

    一.简介 InputStream 和 OutputStream 对于字节流的输入和输出是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定,这两个类是抽象类,而且基本上没什么实现,都是依赖于子 ...

  2. 在VMware Workstation10下CentOS7虚拟机中创建与主机共享文件夹的详细步骤

    一.前言 在使用虚拟机时,常常需要与宿主计算机(以下简称为主机)操作系统交换文件,为此需要在虚拟机与主机之间建立共享文件夹. 二. 安装VMTools 要使用共享文件机制,必须首先安装VMTools. ...

  3. MongoDB 聚合函数及排序

    聚合函数 最大值  $max db.mycol.aggregate([{$group : {_id : "$by_user", num_max : {$max: "$li ...

  4. 谷歌(google)广告尺寸大小列表

    在平时做网页模板时,我们需要计算Google AdSense 的尺寸,以确保它能和页面完美的结合,提高AdSense的点击率,进台后看又很麻烦,下面整理了Google 广告的各种尺寸,跟大家分享一下. ...

  5. Linq to sql之left join运用示例

    示例一: var l= from a in cardsBll.GetCards() join b in usersBll.GetAllUsers() on a.CardSn equals b.Card ...

  6. centos系统基本操作命令

    系统相关命令 查看系统版本: cat  /etc/centos-release 系统更新: yum  update 用户相关命令 增加用户: useradd  [用户名] 设置密码:password  ...

  7. Linux Jetbrains Datagrip 图标找不到

    问题 系统版本:Ubuntu 18.04,Datagrip版本:2019.2 从官网下载的 tar.gz 解压之后,找到 datagrip.sh 就可以使用了.但是有个问题,它没有自动创建快捷方式,所 ...

  8. [书籍翻译] 《JavaScript并发编程》第四章 使用Generators实现惰性计算

    本文是我翻译<JavaScript Concurrency>书籍的第四章 使用Generators实现惰性计算,该书主要以Promises.Generator.Web workers等技术 ...

  9. vue跳转本页面报错

    一个按钮绑定一个方法,方法是跳转到某个路由地址,当已经点击触发方法到该路由下的时候,再进行点击该按钮控制台就会报错,不会影响项目运行 解决方法: if(this.$route.path == '/bi ...

  10. 数据库之sqlite

    数据创建数据 CREATE TABLE IF NOT EXISTS ArpAudit (ID INTEGER PRIMARY KEY autoincrement NOT NULL, UserName ...