zoukankan      html  css  js  c++  java
  • AtCoder Grand Contest 012 D Colorful Balls

    题意:

    有N个球排成一行,第i个球颜色为ci, 权为wi, 如果两个同色球权值和 <= X 则它们可以交换;

    如果两个异色球权值和 <= Y 则它们可以交换;不限制交换次数,求能到达的颜色序列有多少种。

    1<=n<=2e5;1<=x,y<=1e9;1<=ci<=n;1<=wi<=1e9

    分析:

    我们可以通过n^2的枚举,来枚举两个点是否可以交换,如果交换就连一条边

    那么最后会形成若干个连通块,那么每个连通块之间都是独立的,答案相乘;对于一个连通块内部,我们发现即使不是完全图,每两个节点之间也可以通过比较多的操作来交换,所以就相当于是一个有重复颜色的排列问题,ans=num!/(c1!*c2!*c3!*...)

    但是我们不能通过n^2的复杂度来建图

    通过刚才的分析,我们知道,一个连通块里很多边都是多余的,我们只关心连通情况,而不是具体和这个连通块里哪几个点连通(也就是我们尽可能建出一个生成树)

    对于同颜色的球之间的建边,我们去枚举每个球,它只需要判断和权值最小的那个当前颜色球是否能连边

    对于不同颜色球之间的建边,我们去枚举每个球,它只需要与所有颜色与它不同的的球中的最小值(这里需要set来维护,每一次check是logn的)

    那么建图的总的复杂度是O(nlogn)的,总共最多2N条边

    然后对于联通块统计答案即可

  • 相关阅读:
    Oracle notes
    jQuery笔记
    sql developer 要求enter the full pathname for java.exe
    [Error] WCF: SOAP security negotiation
    Unity
    Windows Form 开发笔记
    WP开发 资料整理
    乔迁新居:http://longwarelive.spaces.live.com/
    2008年1月1日启用 longware@live.cn
    《程序员》杂志揭晓2007软件中国年度评选
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6883424.html
Copyright © 2011-2022 走看看