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条边

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

 

posted @ 2017-05-20 22:29  Chellyutaha  阅读(203)  评论(0编辑  收藏  举报