zoukankan      html  css  js  c++  java
  • ZROI 19.08.09模拟赛

    传送门

    写在前面:为了保护正睿题目版权,这里不放题面,只写题解。


    • A

    (70pts:)

    维护一个栈,从一侧向另一侧扫描,如果新加入的元素与当前栈顶相同,则出栈,否则进栈。显然一个子串是括号序列,当且仅当栈为空。

    枚举起点,暴力模拟即可。复杂度(O(n^2))

    (100pts:)

    对于一个右端点,考虑哪些左端点可以和它匹配。

    发现所有合法的左端点,两者栈的内容都是相等的,可以Hash判断。

    实际上考虑每次加入字符时,只会在末尾变动一次,可以用trie树维护。复杂度(O(sigma n))


    • B

    (20pts:)

    随便爆搜即可。

    (40pts:)

    考虑状压,设(f_{state})为选了(state)的建筑公司后,最大的花费。

    每次转移时枚举最后选的建筑公司(i),现在需要求(e_i)

    直接算很难算,考虑容斥。

    发现有一些点集,它们之间的边已经被之前的公司连过了。

    枚举之前选的建筑公司的每个子集(state'),被它影响的点是与(i)的点集的交集,容斥系数是((-1)^{|state'|})

    用bitset维护点集的交集,复杂度(O(frac{3^m n}{w}))

    (70pts:)

    发现本质不同的交集只有(2^m)个,预处理交集大小,容斥时可以直接算。复杂度(O(frac{2^m n}{w}+3^m))

    或者对于每个点,考虑它在哪些点集里出现了。对它未出现的点集的每个子集,将它的权值(-1),预处理复杂度可以降到(3^m)

    (100pts:)

    高维前缀和:设有定义在集合上的函数(f(S)),现在要求(g(T)=sum_{Ssubseteq T} f(S))。直接求是(O(3^n))的,然而通过一些玄妙的手段,可以将它的复杂度降为(O(2^ncdot n))

    对预处理和容斥分别使用高维前缀和即可。


    • C

    (100pts:)

    发现一个排列就是若干个环组成的置换,目标是把环的总数变为(n)

    考虑交换两个元素后环会如何变化。

    发现如果交换同一个环的元素,环会被拆成两份。否则两个环会因此合并。

    因此最小化操作次数等价于最小化合并环的次数。

    考虑什么时候会合并环。对于一个环,如果内部有多于一种颜色(称作异色环),可以从每次交换颜色断点处的两个元素,形成一个新的自环。因此一个异色环可以直接拆成自环,不需要合并。

    否则,环内任意两个元素都无法交换,则必须将其与包含其他颜色的环合并。

    考虑至少需要合并多少次。发现一次合并最优可以将两个颜色不同的同色环合并成异色环。在所有同色环颜色相同时,则只能将一个同色环与某个异色环合并。

    因此每次将出现次数最多的两种颜色的同色环合并是最优的,用堆维护即可。

    一万个特判,一万个边界。辣鸡swk赛场上没调出来,成功爆零了。

    这题太难写了所以放一下代码。戳这里qwq

    对于消异色环,另外一种比较简单的写法是,钦点一种颜色,第一次消去这个颜色所有边,只留一条。第二次用这条边把整个环都消掉即可。

  • 相关阅读:
    grid与oracle用户下oracle程序权限不一致导致无法连接ASM问题
    错误ORA-29760: instance_number parameter not specified的解决办法
    window phone webclient xml 乱码解决方法
    谈谈layout-weight
    状态栏更改颜色
    android 顶部导航栏
    android 布局抽取优化
    Kotlin版HelloWorld
    浅谈synchronized作用
    android获取Tomcat的JSON数据
  • 原文地址:https://www.cnblogs.com/suwakow/p/11375087.html
Copyright © 2011-2022 走看看