zoukankan      html  css  js  c++  java
  • Wannafly挑战赛11

    A

    B

    C(轮廓线dp)

    题意:

      

      

    分析:

      如果以(i,j)为右下角考虑设计dp,那么会需要用到多余的状态,这样状态就很爆炸了

      仍旧考虑轮廓线dp,维护一个格子上的轮廓线的m个状态,考虑从dp(i,j)转移到一个dp(i,j+k)

      即以(i,j)为矩形的左下角去枚举转移,这样只需要轮廓线上的状态就满足了

      时间复杂度O(nm*(2^m)*k)

      代码

    D(hash/SAM)

    题意:

      

    分析:

      对于每个s建立SAM,t在上面查询,这是经典问题,时间复杂度是O(26len),但常数比较大被卡常了

      可以用hash来解决,时间复杂度是O(lenlog|T|)的,但常数比SAM要小,不过因为很长,所以出现冲突的概率就很大,就要用双hash

    E(多项式)

    题意:

      

      

    分析:

      对于$ans_t$,本质上就是多项式$(1+x)^n$的展开式中所有模k余t的项的系数和,从而可以看做是n个长度为k的多项式(1+x)的循环卷积的第t项的系数

      因为k是2的幂次,所以k|(998244353-1),所以可以求出单位根在对应的0~k-1次幂下原本多项式的点值,然后NTT插出循环卷积的多项式即可

      注意到n很大,但我们只需要求类似$a^n % P$,指数对P-1取模不会改变结果

      代码

     F(分治NTT)

    题意:

      

      

    分析:

      首先分析获胜的概率

      若只考虑一堆,那么先手是赢还是输这取决于几步把这个堆取完

      奇数次把这个堆取完的方案数是C(num-1,0)+C(num-1,2)+C(num-1,4)+.....

      偶数次把这个堆取完的方案数是C(num-1,1)+C(num-1,3)+C(num-1,5)+.....

      这两个值是相同的,所以获胜概率其实是相同的

      考虑所有堆,获胜概率应该也是相同的,所以答案是1/2

      但要考虑特殊情况,那就是若所有堆都是1,那么概率要么是0,要么是1,这取决于堆数的奇偶性

      考虑第二个问题,即有多少种取的方法使得先手获胜,同样,这也只是取决于取完所有石子的步数的奇偶性

      f[i][j]表示前i堆j次操作完的方案数,很显然有这样的式子f[i][j]=Σf[i-1][j-k]*C(a[i]-1,k-1)*C(j,k) (1<=k<=a[i])

      后面这个推一推可以用NTT优化

      但是这题n的范围没有给,所以很可能出现这种情况:25000 1 1 1 1 .....,这样时间复杂度会降至O(len^2log(len)),会TLE

      这个式子的本质是这样的:f(i)=f(i-1)与h(i)的卷积

      这个东西其实就是h(1) h(2) h(3) ... h(n)的卷积,分治NTT解决就行了,时间复杂度$O(lenlog^2len)$

      具体实现的时候也不需要递归分治,只需要把h(1) h(2) h(3) ... h(n)丢到一个队列里,然后每次取出队首进行卷积,卷积结果丢到队尾就行了

      代码

  • 相关阅读:
    BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
    BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
    BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
    HDU 2602 Find a way BFS搜索
    HDU 1495 非常可乐 BFS搜索
    UVA 11624 Fire! BFS搜索
    FZU2150 Fire Game BFS搜索
    POJ3414 Pots BFS搜素
    POJ3087 Shuffle'm Up 简单模拟
    POJ 3126 Prime Path BFS搜索
  • 原文地址:https://www.cnblogs.com/wmrv587/p/8568061.html
Copyright © 2011-2022 走看看