CF1188D
题意
给定长度为\(n\)的序列\(\{a\}\),可以执行操作:给任意一个数加上\(2\)的幂次,求使得所有数相同的最小操作个数
做法
转化1:给定长度为\(n\)的序列\(\{a\}\),要求给出长度为\(n\)的序列\(\{b\}\),在\(\forall i,j,a_i+b_i=a_j+b_j\)的条件下让\(\sum popcount(b_i)\)最小
将\(\{a\}\)升序排列
转化2:给定长度为\(n\)的序列\(\{a\}\),已知长度为\(n\)的序列\(\{b\}\)满足\(b_i=b_n+(a_n-a_i)(i\in[1,n))\),求\(b_n\)使得\(\sum popcount(b_i)\)最小
我们将问题按以下方式描述
给定长度为\(n\)的序列\(\{a\}\),求一个\(t\),使得\(popcount(t)+\sum popcount(a_i+t)\)最小
考虑朴素的dp:从低位到高位处理的同时,记录一个集合表示序列有哪些位置在下一位进位
乍一看是集合的状态是\(O(2^n)\)
考虑现在在处理第\(k\)位,将所有数在模\(2^k\)意义下排序(即仅保留较低的\(k\)位),那么向\(k+1\)位进位的状态是\(O(n)\)的