zoukankan      html  css  js  c++  java
  • CF1477D

    题意

    给定一个(n)个点(m)条边的无向图(无自环),需要构造两个(n)阶排列({p},{q})(forall (u,v)in E)满足((p_u-p_v)(q_u-q_v)>0),最大化(sum [p_i eq q_i])

    (nle 5 imes 10^5)

    做法

    很有意思的题

    显然,若一个点的度数为(n-1),一定满足(p_i=q_i)

    那么答案的上界为(n-|{uin V|deg_u=n-1}|),用以下方式构造出这个上界。

    忽略所有(deg_i=n-1)的点。
    如果我们可以将剩下的点分为若干个集合,满足:每个集合至少有两个点,且存在一个点与集合内其他节点没有关联。

    那么可以通过如下方法实现:

    对于每个集合(|S|=k),令与集合内其他节点没有关联的点为(x)(后文称之为关键点),那么可以令这个集合内点在两个排列中对应的集合相同,且为一个连续的区间([l,r]),在(p)中相对大小分别为(1,2,3,ldots,k),在(q)中相对大小分别为(2,3,ldots,k,1)(这里假设(x)(p)中为(k),在(q)中为(1))。

    由于(x)与集合内其他点没有关联,则无所谓,而集合内其他点的相对大小不变。
    再有这个集合在排列中均为连续区间([l,r]),故集合内与集合外的点的相对大小不变。
    (这里的不变,指两个排列中不变)

    那么是否可以将剩余点分为若干个集合呢?
    考虑剩余点构成的图有什么性质:每个点至少与一个点没有关联。

    我们通过如下构造证明有解:

    若存在一个点(v),只与(u)无关联,则让(u)作为关键点,对于所有与其无关联的点,拿出来,作为一个集合(S+{u})
    移除后的合法性:若移除后剩余点集,存在点与所有点均有关联,说明其原来必定(S)中某点无关,这与(S)的定义相悖。
    若不存在某点,至于一个点无关联,即每个点至少与两个点无关,那么任意拿出两个无关的点对((x,y)),对于其他只与(x,y)无关的点,拿出来,作为一个集合(S+{x}+{y})
    合法性同理。

    我做到这里大概就结束了,因为上述方法虽然能完成证明,但使用其来构造是很困难的,因为要维护:({vin V|v只存在两个无关联点}),我无法实现,如果哪位大佬会的话,不吝赐教。

    有两种比较简单实现的方法:
    一、
    对于一个尚未考虑的(x),取任意一个与其无关的点(y)

    • (y)也未考虑过,将(x,y)划分到一个结构中。
    • 如果(y)在某个结构,且是该结构的关键点该结构大小为(2),那么(y)作为关键点,(x)加入该结构。
    • (y)在某个结构,不是该结构的关键点,且结构大小(>2),那么将(y)移除,将(x,y)划分为一个结构。

    二、
    引理:任意一个(|V| eq 0)( ext{dfs})树,均可以分割成上述所说的若干个集合(即若干个菊花图)

    考虑每次最深的叶子节点所在菊花图,然后通过归纳容易证明

    就只需要求补图的( ext{dfs})树,容易线性时间内得到。

  • 相关阅读:
    java封装
    本人的其他博客
    codeforces 1000C
    1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】
    1009E Intercity Travelling 【数学期望】
    codeforces 1009D Relatively Prime Graph【欧拉函数】
    1077E Thematic Contests 【二分答案】
    codeforces 1077D Cutting Out 【二分】
    【非原创】ZOJ
    数字千万别用puts!
  • 原文地址:https://www.cnblogs.com/Grice/p/14944211.html
Copyright © 2011-2022 走看看