zoukankan      html  css  js  c++  java
  • 杂题

    题意

    给定一个长度为(n)( ext{01})序列,可以将序列分成若干块(每个位置恰好属于一个块),使得每个块和为奇数,对于(iin[1,n]),求每块长度(le i)最少可以分成多少块。
    (nle 1e6)

    做法

    假设每块长度不超过(m)

    令原序列为({a_i}_{i=1}^n),令(b_i=igopluslimits_{j=1}^i a_j)

    那么就是从(0)(n),每次跳的位置不用于当前的(b_i)

    观察1:若当前在位置(i),最优解一定为这两种情况:
    (1)((i,i+m])内离(i)最远的,不同于(b_i)的位置。
    (2)假设(1)的位置为(j),最大的(k(b_k=b_i))使得((i,k))存在不同于(b_i)的。

    那么可以在预处理后,单次(O(n))次求解。

    观察2:若存在解,则最少步数(le 3lceilfrac{n}{m} ceil)

    观察3:若(i)存在解走到(n),那么每次走(2)必定能走到,且步数(le 3lceilfrac{n-i+1}{m} ceil)

    现在,我们得到了一个(O(n/m))单次判断是否存在解。

    观察4:若在(i)走(1)能到达(n),那存在最优解在这一步走(1)。

    现在,得到了一个单次(O((n/m)^2))求解:即每次(O(n/m))判断(1)位置是否可以到达(n),若可以则走,否则走(2)。

    结合(O(n))的做法,得到了一个(min(n,(n/m)^2))(sumlimits_{m=1}^n min(n,(n/m)^2))(O(nsqrt{n}))级别的。

    (O(nlog n))预处理出点(i)走到(n)最小的(m)是多少,则可以单次(O( ext{最优步数})),总复杂度(O(nlog n))

  • 相关阅读:
    杭电OJ 输入输出练习汇总
    七月读书笔记
    情报分析报告阅读笔记
    情报研究与分析入门阅读笔记
    旁观者攻击
    域前置技术相关学习
    CC攻击和C2的区别
    DNS投毒学习分析总结
    数字证书2.0版本学习总结
    《在树洞里》-感悟
  • 原文地址:https://www.cnblogs.com/Grice/p/14866702.html
Copyright © 2011-2022 走看看