题面
https://www.luogu.com.cn/problem/P2210
题解
一开始没反应出来是状压,看了少数题解才知道可以状压。今天姑且 A 掉状压的写法,明天写写看模拟退火。
首先,我们来设状压的状态方程:
代表 表示成二进制的时候有 那些位所代表的牛组成的集合- 比方说
代表有 号牛组成的集合 代表牛的集合为 时对答案产生的贡献。
什么是贡献?这个说法很模棱两可。其实是这样的:两个朋友都在集合里面,那答案必然要包括这对朋友连线的贡献。但是如果只有一头牛在集合里呢?很简单,贡献就是:按照某种最佳排列时,这头牛所处的位置到集合队尾的距离。这么说很抽象,我们举个例子:
上图中,
而如果在这个队列之后紧跟就是
好。赘述完关于状态的定义,我们来思考状态怎么转移。对于集合
代码
最终给出的代码时间复杂度为