zoukankan      html  css  js  c++  java
  • CF1392G

    CF1392G

    给定一个长度为 (k)01(s,t),给定 (n) 个操作,第 (i) 个操作为交换 (s) 中的 (u_i)(v_i)

    然后你选择一个区间的操作依次执行,这个区间的长度不能小于 (m)

    最大化 (s)(t) 相同的位置数量。

    (m,nle 10^6,kle 20)

    Solution

    神仙题。

    (w(s,t)) 表示 (s)(t) 得到的答案。

    (p(l,r)) 表示顺序操作 (l o r)

    (p(r,l)) 表示顺序操作 (r o l)

    • 性质 1

    (sxrightarrow{p(l,r)}s',txrightarrow{p(l,r)}t',w(s,t)=w(s',t'))

    注意到每一位是独立被操作了相同的,不会改变。

    所以设 (sxrightarrow{p(l,r)}s'),那么若 (s'xrightarrow{p(r+1,n)}s'',txrightarrow{p(r+1,n)}t''),则 (w(s',t)=w(s'',t''))

    同理,答案也等价于 (s'xrightarrow{p(l-1,1)}s'',txrightarrow{p(r,1)}t'') 情况下的答案。

    所以我们得到了 (n) 个字符串 (s')(n) 个字符串 (t'),我们发现问题等价于选两个下标差大于等于 (m) 的字符串并得到答案。

    还是不好做。

    然后观察到,所有 (s/t) 的二进制下 (1) 的个数固定,设 ( extrm{bit}(s))(a)( extrm{bit}(t)=b)( extrm{bit}(s~mathbf{and}~t)=c),那么有答案为 (k-(a-c)-(b-c)=k-a-b+2c),所以问题等价于最大化 (c)

    然后维护 (f_{0,x}) 表示所有 (s_i=x) 中最小的 (i),维护 (f_{1,x}) 表示所有 (t_i=x) 中最大的 (i)

    然后将他们进行子集转移,对于某个 (x),如果 (f_{1,x}-f_{0,x}ge m),那么就可以更新答案,即存在两个字符串满足其并大于等于 ( extrm{bit}(x))

    复杂度为 (mathcal O(nk+2^kk))

  • 相关阅读:
    [转]oracle in 多个字段
    [转][MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据
    SQL Server “复制”表结构,创建_Log表及触发器
    [转]WordPress主题开发:主题初始化
    struts2请求过程源码分析
    java调优
    websocket之四:WebSocket 的鉴权授权方案
    高可用性及容灾的几个衡量指标
    Struts2返回JSON对象的方法总结
    java websocket @ServerEndpoint注解说明
  • 原文地址:https://www.cnblogs.com/Soulist/p/13657478.html
Copyright © 2011-2022 走看看