• 【做题】CF1045(ABH)


    原文链接https://www.cnblogs.com/cly-none/p/9697662.html

    题目当然不会做完了,这里只讲有做&会做的。


    A. Last chance

    题意:有(n)个敌方飞船,己方有(m)个武器,有以下三种类型:

    • 能攻击编号属于一个大小为(k_i)的集合的所有飞船。
    • 能攻击编号在([l_i,r_i])区间内的所有飞船。
    • 能攻击三个飞船,编号分别为(a_i,b_i,c_i)

    其中,前两种类型的武器每个只能攻击(1)个飞船,第三种每个只能使用(0)次或(2)次。

    特别性质:每个飞船最多会被一个第三种武器纳入攻击范围。

    在每个飞船只能被攻击一次的情况下,问最多能攻击到多少个飞船,并输出方案。

    (n,m leq 5000, \, sum{k_i} leq 10^5)

    容易想到,本题是个最大流。

    那么,第一种武器可以暴力连边,第二种武器可以线段树优化建图,问题就在于第三种武器,只能使用(0)次或(2)次。

    接下来当然要考虑特殊性质。考虑每个被同一个第三种武器锁定的三元组,它们其中只要有一个被前两种武器攻击,就可以全部被攻击;否则也能有两个被攻击。换言之,不考虑第三种武器,每个三元组最多被攻击一次。因此,我们每个三元组建一个辅助点让它们的流量和小于等于(1),就相当于是把第三种武器处理掉了。统计答案时再加上第三种武器的贡献就可以了。

    那么,点数、边数就是(O(n log n))的了。

    最后输出方案,一个好写的方法是类似于找增广路,把已有的流量一条条退回去就好了。


    B. Space Isaac

    在模(m)的意义下,给出一个大小为(n)的集合(A)。询问任取两个元素,一个在这个集合里,一个不在,相加所不能得到的数有那些。

    (n leq 2 imes 10^5, \, m leq 10^9)

    考虑一个数(x)如果不能得到,那么对于所有(y in A),一定有(x - y in A)。那么,我们把所有数按0/1表示它在不在集合(A)中,得到的一个0/1无限序列一定关于(x)对称。当然,对称只用看(m)位就可以了。因此,我们枚举这(m)位最左端的(1)(A)中的哪一个元素,最右端的(1)也就确定了,然后用字符串哈希判断字符串是否回文就好了。

    时间复杂度(O(n))


    H. Self-exploration

    求在([l,r])区间内有多少数满足在二进制下:

    • 子串(00)的个数为(C_{00})
    • 子串(01)的个数为(C_{01})
    • 子串(10)的个数为(C_{10})
    • 子串(11)的个数为(C_{11})

    答案对(10^9 + 7)取模。

    (l,r leq 2^{10^5})

    首先,我们容易得到所有满足条件的数二进制下的长度。

    考虑没有([l,r])的限制的情况。整个0/1序列就是很多段连续全0或全1的序列,而通过(C_{01},C_{10})这两个常数,我们可以计算得到,全0的序列有多少个,全1的序列又有多少个。然后,我们也能得到一共有多少个0和1。于是问题就变成了把若干个1分到若干个全1序列中,若干个0分到若干个全0序列中,这可以用插板法来求。

    而存在([l,r])的限制的情况下,我们先把限制转化为([0,r))的类型,然后枚举前面有多少位是相同的。也就是说,我们计算的二进制数小于(r)的情况下,它们不同的最高一位,一定是在(r)(1)的位置上填了(0)。之后就可以忽略(r)的限制了。因此,我们枚举最高的不同的一位就好了。

    时间复杂度(O(log r))


    小结:这三道题都是可以自己想出来的,但在比赛时还是被BH卡住了。实际上B题对答案有分析就好了,H题在于不能粗暴往数位dp的方向去想。

  • 相关阅读:
    淘宝首页性能优化实践
    Ubuntu16.04下搭建Go语言环境
    ubuntu下nvm,node以及npm的安装与使用
    idea 新建/导入的xml 报文头报错 URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
    Spring Boot 请求返回字符串中文乱码
    Java 从FTP下载.上传文件
    Spring boot 定时器
    spring boot集成mybatis 自动生成实体类和mapper文件、Dao层
    Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found
    Oracle中创建序列
  • 原文地址:https://www.cnblogs.com/cly-none/p/9697662.html
Copyright © 2020-2023  润新知