zoukankan      html  css  js  c++  java
  • IOI2020国家集训队作业做题记录

    Part 1 1-50

    Part 2 51-100

    Part 3 101-150

    进度(2/50)

    (color{#FF003F}{ exttt {AGC029F}})

    神题。
    观察下什么时候会无解,对于任意一个元素是给定集合的集合,若左侧与其中任意一个集合相连的点的数量 (geq) 集合大小,则无解。即若存在 ({E_i | 1 leq i leq n}) 的一个子集 (S),若 (f(S)=|{u in E in S}|<=|S|),则无解。
    这显然是必要条件,否则会连出环。

    构造二分图,把 (n) 个点放在左边,(n-1) 个集合放右边,点向包含的所有集合连边。如果此二分图不存在完美匹配,答案肯定是 (-1)
    反证:如果可以构造出,那么可以让每条树上的边与深度较深的点匹配,匹配数是 (n-1)

    否则左侧有且仅有一个未匹配点,从它开始dfs,每次找与其相连的未经过的右侧点,与它的对应匹配点连边,递归下去dfs。
    考虑此方法的正确性,我们需要证明这样构造出的是一棵树 且 有解不会构造不出。

    这样构造出的是一棵树:显然会有 (n-1) 条边,因为一个右侧点只会与一个左侧点匹配,所以构造不出环。

    有解不会构造不出:假设这种情况存在,那么存在一个时刻,存在右侧剩余点和左侧剩余点,且左侧经过的点与右侧剩余点无边。
    因为我们同时 dfs 到一个右侧点和与其匹配的左侧点,所以左侧经过点的数量等于右侧经过点的数量+1(一开始的未匹配点),右侧剩余点数量等于左侧剩余点数量。令 (S) 是右侧剩余点的集合,因为 (S) 中的点都有匹配点且左侧经过的点与右侧剩余点无边,所以右侧剩余点和左侧剩余点相互匹配,则 (f(S)=|S|),所以无解。

    代码

    (color{#FF003F}{ exttt {AGC030D}})

    (dp_{t,i,j}) 表示 (t) 次操作后 (a_i>a_j) 的方案数,(t) 那一维滚动掉,每次只会影响 (O(n+m)) 个位置。
    暴力dp即可。

  • 相关阅读:
    元素居中浏览器的多种方法集锦
    javascript深入理解js闭包
    闭包
    碎片
    define
    define定义方法
    创建数据库sql语句
    java十进制转换成二进制数
    java解析JSON数据
    java实现最通俗易懂的01背包问题
  • 原文地址:https://www.cnblogs.com/Frame233/p/12622859.html
Copyright © 2011-2022 走看看