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即可。

  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/Frame233/p/12622859.html
Copyright © 2011-2022 走看看