zoukankan      html  css  js  c++  java
  • CF1450G

    题意

    (n) 名工人站成一排。用一个长度为 (n) 的字符串 (s) 表示他们的工作,其中第 (i) 个人的工作为(s_i)。给定一个有理数 (k=frac{a}{b})作为参数。
    每次操作中,可以选择一个至少存在一名工人的工作 (x)。设所有工作为 xx 的工人的位置为 (i_1,dots,i_m(i_1<dots< i_m)),若 (kcdot(i_m-i_1+1)le m),则可以再选择另一个至少存在一名工人的工作 (y),并将所有工作为 (x) 的人的工作替换成 (y)
    若可以通过若干次(含 (0) 次)操作将所有人的工作替换成 (x),则称工作 (x) 是可达到的。求出所有可达到的工作。

    (1le ale ble 10^5,nle 5000),字符集大小(le 20),空间限制( ext{32mb})

    做法

    定义0:令(C)表示(s)中的字符集。

    假设有一系列操作,最终字符转换为(x)。对于所有(y)转换为(z)的操作,让我们添加一条有向边((y ightarrow x))。其结构为一个以(x)为根的内向树。

    定义1:对于一个字符(y),用(l_y)表示第一次出现的位置,用(r_y)表示最后一次出现的位置。

    定义2:对于任意非空的字符集合(S),定义(range(S)=[minlimits_{yin S}l_y,maxlimits_{yin S}r_y]),定义(cnt(S))(S)中字符出现的次数。

    对于有根树,对于非根节点(y),令(S_y)表示(y)子树字符集,都满足:

    [mathrm{cnt}(S_y)ge k left|mathrm{range}(S_y) ight|. ag{1} ]

    定义3:对于树的每个节点,均满足以上条件,则称为有效树;对于一个森林的每个节点,均满足以上条件,则称为有效森林。

    定义4:对于任意字符集(M),令(dp(M))为:(M)是否可以组成有效森林。

    (dp(Cackslash{x}))为真,则(x)可以成为答案。
    两种转移

    • 一棵树:(M)满足((1)),且(exists yin M,dp(Mackslash {y}))为真,则(dp(M))为真。
    • 一个森林:(M)满足((1)),且存在子集(Ssubset M)使得(dp(S))(dp(Mackslash S))为真,则(dp(M))为真。

    这样转移复杂度是(O(3^{|C|}))的。

    观察:对于第二种转移,可以假设(range(S)cap range(Mackslash S)=emptyset)

    可以通过调整法,将有效树,转换为满足假设的有效树。

    因为我们有:
    (mathrm{cnt}(Acup {y}cup Bcup {z})= mathrm{cnt}(Acup {y})+mathrm{cnt}(Bcup{z}))
    (ge k cdot left|mathrm{range}(Acup {y}) ight| + kcdot left|mathrm{range}(Bcup {z}) ight|ge kcdot left|mathrm{range}(Acup {y}cup Bcup {z}) ight|.)

    由此,第二种转移的个数缩减到了(O(|C|2^{|C|})),可以通过此题。

  • 相关阅读:
    根据View找控制器
    ScrollView双击图片定点放大
    iOS消息推送原理和实现总结
    iOS完整学习路线图
    获取设备版本
    UIView与CALayer的区别,很详细
    iOS开发网络数据之AFNetworking使用
    (已实践)PLSQL本地还原Oracle数据库dmp文件
    所遇Oracle错误代码
    Dapper基本使用
  • 原文地址:https://www.cnblogs.com/Grice/p/14951769.html
Copyright © 2011-2022 走看看