• 省选模拟13


    A. 同桌的你

      考试的时候大概一上来就会了,然而感觉非常麻烦,不想打。等到最后剩1个半小时的时候开始打,到最后也没调出来,非常自闭。

      不难发现将关系连边得到的是一棵基环树,所以可以考虑断掉环上任意一条边,然后分选择这条边和不选这条边分别做一次树形dp即可。

      对于输出方案,考虑记录转移的前驱,之后再dfs一遍输出答案。

    B. 大水题

      考虑枚举每一种颜色方案,将所有颜色的数量与第一种颜色的数量做差,那么区间[i,j]合法的条件是[1,i]和[1,j]差分之后相同,可以使用hash来完成这个过程。

      然而暴力的复杂度是$O(n*2^8*O(hash))$,听上去就很不对。

      所以考虑优化。

      对于一个确定的右端点,可能有贡献的方案只有8种,所以考虑只维护这8种方案。

      枚举右端点,在右端点右移的时候,找到当前右端点颜色的前驱,只需要修改这一段即可。

      复杂度均摊$O(8n*O(hash))$

    C. 佛罗里达

      考场上大概想到了40分的暴力做法,可是没有想到2-sat,以为并查集也能实现这些操作。

      考虑枚举其中一个集合的权值大小,对于另外一个集合权值显然可以二分,考虑如何检验是否存在合法解。

      将边按照与两个集合权值大小的关系分类,分别对应随便选,不同时选,选一个,是显然的2-sat模型,tarjan判断即可。

      考虑如何优化这个东西。

      求出来一棵最大生成树,那么生成树上的边一定可以作为集合的权值。

      否则,将树黑白染色,若某一条非树边连接了两个颜色不同的点,那么必然不是最大的。

      所以,集合的权值只能是树边或者全部为颜色相同的点时的贡献。

      枚举即可,$O(n^3logn)$

  • 相关阅读:
    Hibernate学习笔记
    Servlet:从入门到实战学习(3)---Servlet实例【图文】
    Servlet:从入门到实战学习(2)---Servlet生命周期
    Servlet:从入门到实战学习(1)---全·环境配置
    java复习(9)---数据库JDBC
    java复习(8)---I/O
    java复习(7)---集合类、泛型
    java复习(6)---异常处理
    C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    C# TTS 文本转语音中断实现方式
  • 原文地址:https://www.cnblogs.com/hzoi-cbx/p/12244097.html
Copyright © 2020-2023  润新知