zoukankan      html  css  js  c++  java
  • 老年选手康复训练

    学考考完了。虽然身为d类咸鱼选手还是要好好备战一下noi的。

    从今天开始进行康复训练,不过白天应该还是要肝文化课。等过几天训练时间应该会多一点。

    [CTS2019]随机立方体

    这道题现在做了一遍好像有一点sibo啊,可能是考试的时候太紧张了吧。

    题意就不写了。

    题目要求恰好(k)个,那我们考虑用至少含(i)个进行容斥。

    那么容斥系数(f_i)需要满足:

    [[i=k]=sum_{j=0}^i{ichoose j}f_j ]

    进行二项式反演,得到:

    [f_i=sum_{j=0}^i(-1)^{i-j}{ichoose j}[j=k] ]

    即:

    [f_i=(-1)^{i-k}{ichoose k} ]

    由于在(i<k)({ichoose k})等于(0),因此上面的式子是良定义的。

    那么考虑如何计算至少含(i)个极大数的概率。

    首先极大数的行号、列号、bule号(bule代表第三维的名称)一定不是相同的。

    比较关键的一点是,我们可以注意到任何钦点(i)个两两坐标全不同的格子为极大数的概率都是相同的。于是我们可以找一个比较特殊的位置计数,比如让他们的坐标为((1,1,1))((2,2,2))(dots)((i,i,i))。同时我们钦点(a_{1,1,1}<a_{2,2,2}<dots<a_{i,i,i})

    思考一下,可以发现如果我们只观察至少有一维横坐标(leq i)的格子,((i,i,i))一定是其中的最大值。如果我们只观察至少有一维横坐标(leq i-1)的格子,((i-1,i-1,i-1))一定是其中的最大值。以此类推即可。不难发现只要满足上述条件,那么这个方案一定合法。

    我们设(a_i)表示所有横坐标至少有一维(leq i)的格子数。那么满足之前所述条件的概率就是:

    [prod_{j=1}^ifrac{1}{a_j} ]

    同时还要注意,这只是我们钦点的位置和大小关系之后的答案,所有合法的选取位置和大小关系的方案共有({nchoose i}{mchoose i}{lchoose i}*(i!)^3)种,其组合意义是分别选出三维的横、纵、bule坐标,再决定大小关系。

    后面的方案数可以用预处理阶乘及逆元实现(O(1))计算,之前的概率,则可以通过线性求逆元均摊(O(1))计算。于是做一组数据就是(O(n))的,总复杂度(O(Tn))

    [CTS2019]珍珠

    [F(x)=sum_{igeq 0}frac{[imod 2=1]}{i!}x^i=sinh(x)=frac{e^x-e^{-x}}{2} ]

    [G(x)=sum_{igeq 0}frac{[imod 2=0]}{i!}x^i=cosh(x)=frac{e^x+e^{-x}}{2} ]

    [Ans=sum_{k=0}^{n-2m}{Dchoose k}n![x^n]F^kG^{D-k} ]

    用二项式定理把(F^k)(G^{D-k})展开,可以得到:

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i=0}^ksum_{j=0}^{D-k}{Dchoose k}(-1)^{k-i}{kchoose i}{D-kchoose j}(2(i+j)-D)^n ]

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i=0}^ksum_{j=0}^{D-k}frac{D!(-1)^{k-i}(2(i+j)-D)^n}{(k-i)!i!(D-k-j)!j!} ]

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i=0}^ksum_{j=0}^{D-k}frac{(2(i+j)-D)^nD!}{(i+j)!(D-(i+j))!}*frac{(i+j)!}{i!j!}*frac{(-1)^{k-i}(D-(i+j))!}{(k-i)!(D-k-j)!} ]

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i=0}^ksum_{j=0}^{D-k}(2(i+j)-D)^n{Dchoose i+j}{i+jchoose i}(-1)^{k-i}{D-(i+j)choose k-i} ]

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i+j=0}^{D}(2(i+j)-D)^n{Dchoose i+j}sum_{i=0}^k{i+jchoose i}(-1)^{k-i}{D-(i+j)choose k-i} ]

    考虑([x^i](1+x)^n={nchoose i})([x^i](1-x)^n=(-1)^i{nchoose i})

    因此$${i+jchoose i}=x^i^{i+j},(-1)^{k-i}{D-(i+j)choose k-i}=x^{k-i}^{D-(i+j)}$$

    [sum_{i=0}^k{i+jchoose i}(-1)^{k-i}{D-(i+j)choose k-i}=sum_{i=0}^kBig([x^i](1+x)^{i+j}Big)*Big([x^{k-i}](1-x)^{D-(i+j)}Big)=[x^k](1+x)^{i+j}(1-x)^{D-(i+j)} ]

    [Ans=frac{1}{2^D}sum_{k=0}^{n-2m}sum_{i=0}^{D}(2i-D)^n{Dchoose i}[x^k](1+x)^i(1-x)^{D-i} ]

    (a_i=frac{(2i-D)^n{Dchoose i}}{2^D})

    [Ans=sum_{k=0}^{n-2m}sum_{i=0}^{D}a_i[x^k](1+x)^i(1-x)^{D-i} ]

    [Ans=sum_{k=0}^{n-2m}[x^k]Big(sum_{i=0}^{D}a_i(1+x)^i(1-x)^{D-i}Big) ]

    考虑先把(sum_{i=0}^Da_i(1+x)^i(1-x)^{D-i})算出来,最后一个个加。

    至于这个,可以使用分治fft大法。

    什么一个log,分治fft天下第一。

    [CTS2019]氪金手游

    现在想想怎么又比较简单啊。

    考虑把关系树随便钦点一个当根。

    由于正向边(向儿子连的边,表示必须早于儿子)和反向边同时存在,因此比较麻烦。考虑用容斥将反向边变为正向边,即:选出一个反向边子集(S),强制这些边必须被违反,其余反向边随意。注意正向边是永远需要满足的。计算得这样计算出的方案有((-1)^{|S|})的贡献。

    对于一种选法,原树用正向边分成了若干联通块。对于一个点(i),设(s_i)表示是它的子树中的点的集合。如果只考虑这棵子树,我们显然要满足(i)是第一个被抽出来的,概率就是(frac{w_i}{sum_{jin s_i}w_j}),接下来可以分成若干子树递归。

    那么若干种方案就可以合起来算概率了。我们设(dp_{i,j})表示以(i)为根的子树,当((sum_{kin s_i}w_k)=j)时,目前满足所有条件的情况乘以他们的系数的概率和。转移比较容易得到。

    [ZJOI2019]开关

    这真是一道好题,被送退役得心服口服。

    先说几个结论:

    我们设( ilde f)表示集合幂级数(f)在快速沃尔什变换(( ext{FWT}))后的形式。

    那么:

    [[x^S] ilde f=sum_{T}(-1)^{|Scap T|}[x^T]f ]

    ( ext{FWT})的意义中可以看出。

    [sum_{T}(-1)^{|Scap T|}=2^n[S=emptyset] ]

    其中(n)代表全集的大小。这和子集容斥的原理是相似的。

    [sum_{T}[x^T] ilde f=2^n[x^{emptyset}]f ]

    用前一个式子不难证明。

    现在说题目的解法。

    根据题目描述,我们设([x^S]f)表示第一次到达状态(S)的期望步数。为了分析方便,我们也可以将其看成是从状态(S)到空集的期望步数。那么对于(S eq emptyset),我们就有:

    [[x^S]f=Big(sum_ifrac{p_i}{sum_j p_j}[x^{SDelta{i}}]fBig)+1 ]

    为了更方便的表达这个式子,我们设形式幂级数(g),其中当(S={i})时,([x^S]g=frac{p_i}{sum_j p_j}),否则([x^S]g=0)

    于是上式可以表达为:

    [f=Big(sum_{T}x^TBig)+fg+cx^{emptyset} ]

    其中(c)是某个不确定的系数,起到补偿(emptyset)不符合该式的作用。我们尝试进行( ext{FWT}),对于(sum_{T}x^T),它是(x^{emptyset})进行( ext{FWT})后的结果,因此其( ext{FWT}^{-1})的结果为(x^{emptyset}),所以其( ext{FWT})后的结果为(2^nx^emptyset)。因此:

    [[x^S] ilde f=2^n[S=emptyset]+[x^S] ilde f[x^S] ilde g+c ]

    [(1-[x^S] ilde g)[x^S] ilde f=2^n[S=emptyset]+c ]

    考虑([x^emptyset] ilde g=sum_{i}frac{p_i}{sum_j p_j}=1),因此将(S=emptyset)代入上式可得(c=-2^n)

    那么对于(S eq emptyset),就有:

    [[x^S] ilde f=-frac{2^n}{1-[x^S] ilde g} ]

    代入( ext{FWT}^{-1})的式子中,我们就有:

    [[x^S]f=frac{1}{2^n}Big(sum_{T}(-1)^{|Scap T|}[x^T] ilde fBig)=frac{[x^emptyset] ilde f}{2^n}-Big(sum_{T eq emptyset}(-1)^{|Scap T|}frac{1}{1-[x^T] ilde g}Big) ]

    而由于([x^emptyset]f=0),根据之前的结论,(sum_T[x^T] ilde f=0),所以([x^emptyset] ilde f=-Big(sum_{T eq emptyset}[x^T] ilde fBig)=sum_{T eq emptyset}frac{2^n}{1-[x^T] ilde g})

    因此:

    [[x^S]f=frac{1}{2^n}Big(sum_{T}(-1)^{|Scap T|}[x^T] ilde fBig)=Big(sum_{T eq emptyset}frac{1}{1-[x^T] ilde g}Big)-Big(sum_{T eq emptyset}(-1)^{|Scap T|}frac{1}{1-[x^T] ilde g}Big) ]

    [[x^S]f=sum_{T eq emptyset}[|Scap T|equiv1(mod 2)]frac{2}{1-[x^T] ilde g} ]

    代入([x^T] ilde g=sum_{i}(-1)^{[iin T]}frac{p_i}{sum_j p_j}),得(1-[x^T] ilde g=sum_{i}[iin T]frac{2p_i}{sum_{j}p_j}),回代入原式,得:

    [[x^S]f=sum_{T eq emptyset}[|Scap T|equiv1(mod 2)]frac{sum_{j}p_j}{sum_{iin T}p_i} ]

    [[x^S]f=Big(sum_j p_jBig)*Big(sum_{T eq emptyset}[|Scap T|equiv1(mod 2)]frac{1}{sum_{iin T}p_i}Big) ]

    由于(sum_j p_j)非常小,因此后面的式子可以通过简单的(dp)计算出来。

    [ZJOI2019]语言

    考场上只会写3个(log)的我太菜了。

    考虑对于一个点,它能交流的所有点就是经过它的链的并。

    我们可以用线段树来维护一个点集的连通并的点数(即最小的使得某些点都在内的连通块的点数),具体做法不讲了(想必这篇博客没有人看的233,如果有人问再加上去吧)。再用树上差分思想,在点上添加事件,加上线段树合并,就做完了。

    虽然是一个(log)的但我写出来跑的有点慢,可能我太菜了。

    LOJ #575 不等关系

    一道不算很难的容斥题。

    考虑最简单的容斥方法,用(至少违背零个大于号-至少违背一个大于号+至少违背两个大于号dots)来计算,对于至少违背(k)个大于号的方案数,可以发现当我们选定了哪些位置违背以后,限制就只剩下小于号了。此时长度为(n+1)的排列会被分成(m)部分,大小分别为(a_1,a_2,dots,a_m),每一段内要满足大小递增。那么此时的答案就是:

    [{n+1choose a_1,a_2,dots,a_m}=frac{(n+1)!}{prod_{i=1}^ma_i!} ]

    ((n+1)!)对于所有方案都是相同的,我们可以不管它。于是只要将所有段的大小的阶乘的逆元相乘就是方案数。

    首先考虑暴力做法,我们根据字符串(s)先将排列划分为(m)段,大小分别为(a_1,a_2,dots,a_m)(这和上面的定义不一样,只是我懒得换字母了),由于容斥的关系,一些段可能会并起来。我们假定违背了其中(k)个大于号,合并后段的大小分别为(b_1,b_2,dots,b_{m-k}),那么这种方案的贡献为((-1)^kBig(prod_{i=1}^{m-k}frac{1}{b_i!}Big))

    那么考虑(dp),我们设(f_i)表示只考虑前(i)段,所有方案的贡献和。设(S_i)表示(a)的前(i)项和。那么我们只要枚举第(i)段会与前面的几段合并,就可以得出方程:

    [f_i=sum_{j=0}^{i-1}(-1)^{i-j+1}f_jfrac{1}{Big(S_i-S_jBig)!} ]

    就得到了(O(n^2))的做法。

    可以注意到,由于和式中的最后一项非常复杂,因此很难优化成卷积形式。我们考虑更换一种方法,改设(f_i)表示只考虑排列的前(i)个,所有方案的贡献和。值得注意的是如果(i)(i+1)之间是小于,即原本在一段内的,那么我们可以任意取(f_i)的值,因为我们将看到它对后面是没有影响的。我们再设(a_i)表示(i)(i+1)之间是否用大于号连接(即可以断开),特别的,(a_0=a_{n+1}=1)。设(S_i)表示(a)的前(i)项和。

    根据之前的思路,易得:

    [f_i=sum_{j=0}^{i-1}(-1)^{S_i-S_j+1}a_jf_jfrac{1}{(i-j)!} ]

    变化一下,得:

    [(-1)^{S_i}f_i=sum_{j=0}^{i-1}Big(a_j(-1)^{S_j}f_jBig)*Big(-frac{1}{(i-j)!}Big) ]

    可以发现,虽然其转化为简单的卷积式比较困难,但是借助分治fft,我们就可以先将((-1)^{S_i}f_i)算出来,再乘上(a_i)贡献给后面了。复杂度(O(nlog^2 n))

    所以说,分治fft天下第一。

  • 相关阅读:
    [bzoj4653] [NOI2016]区间
    [bzoj5285] [HNOI2018]寻宝游戏
    [bzoj4071] [Apio2015]巴邻旁之桥
    [bzoj1146] [CTSC2008]网络管理Network
    [bzoj3004] [SDOi2012]吊灯
    [bzoj5321] [Jxoi2017]加法
    [bzoj5010] [FJOI2017]矩阵填数
    [bzoj3504] [CQOI2014]危桥
    ASP.NET
    ASP.NET
  • 原文地址:https://www.cnblogs.com/Mr-Spade/p/11115654.html
Copyright © 2011-2022 走看看