B.Distance
贪心(?)
题目大意
对于两个大小相同的多重集 A , B \mathbb{A},\mathbb{B} A,B ,可以选择其中任一元素 x x x 执行操作 x = x + 1 x=x+1 x=x+1 任意次数,最少的使得 A , B \mathbb{A},\mathbb{B} A,B 相同的操作次数记为 C ( A , B ) C(\mathbb{A},\mathbb{B}) C(A,B)
不同大小的 A , B \mathbb{A},\mathbb{B} A,B 视为 C ( A , B ) = 0 C(\mathbb{A},\mathbb{B})=0 C(A,B)=0
现在,给定两个大小为 n n n 的多重集 S , T \mathbb{S},\mathbb{T} S,T ,求对于 S , T \mathbb{S},\mathbb{T} S,T 的所有子集 A , B \mathbb{A},\mathbb{B} A,B ,最少操作次数之和 ∑ A ⊆ S ∑ B ⊆ T C ( A , B ) \sum\limits_{\mathbb{A} \subseteq \mathbb{S}}\sum\limits_{\mathbb{B} \subseteq \mathbb{T}} C(\mathbb{A},\mathbb{B}) A⊆S∑B⊆T∑C(A,B) 的值
具有相同值的两个元素视为不同元素,答案取模
解题思路
对于某对子集 A , B \mathbb{A},\mathbb{B} A,B ,为了使他们相同的操作次数最少,我们会将他们排序的元素后一一对应,使每一对中较小的数变成较大的数//假设 a i a_i ai 与 b i b_i bi 对应,他们在这次变化中贡献的操作次数显然是 ∣ a i − b i ∣ |a_i-b_i| ∣ai−bi∣
那么换一种角度考虑,对于原多重集 S , T \mathbb{S},\mathbb{T} S,T ,任取一对数 a i , b j a_i,b_j ai,bj ,考虑它们俩对应的方案数 c n t i , j cnt_{i,j} cnti,j ,那么它们在全部方案中贡献的总操作次数即为 ∣ a i − b i ∣ × c n t i , j |a_i-b_i|\times cnt_{i,j} ∣ai−bi∣×cnti,j
由于我们的操作策略是排序后对应,因此先对 S , T \mathbb{S},\mathbb{T} S,T 进行排序//
选定两个数 a i , b j a_i,b_j ai,bj 后,它们在 S , T \mathbb{S},\mathbb{T} S,T 中的位置前面选 k k k 对数的方案数为 ∑ k = 0 m i n ( i − 1 , j − 1 ) C i − 1 k C j − 1 k = C i + j − 2 k \sum\limits_{k=0}^{min(i-1,j-1)}C_{i-1}^kC_{j-1}^k=C_{i+j-2}^k k=0∑min(i−1,j−1)Ci−1kCj−1k=Ci+j−2k (范德蒙德卷积)
同理,它们在 S , T \mathbb{S},\mathbb{T} S,T 中的位置后面选 k k k 对数的方案数为 C 2 ∗ n − i − j k C_{2*n-i-j}^k C2∗n−i−jk
总方案数为 c n t i , j = C i + j − 2 k C 2 ∗ n − i − j k cnt_{i,j}=C_{i+j-2}^kC_{2*n-i-j}^k cnti,j=Ci+j−2kC2∗n−i−jk ,乘以两数之差的绝对值即为它们对答案的总贡献//
预处理组合数,枚举 i , j i,j i,j 求和即可
时间复杂度
O ( n 2 ) O(n^2) O(n2)
参考代码
参考代码为已AC代码主干,其中部分功能需读者自行实现
#define N 2005
void solve()
{ll n,t;cin >> n;vector<ll> a(n),b(n);for(auto &x:a) cin >> x;for(auto &x:b) cin >> x;ll re=0;SORT(a);SORT(b);FORLL(i,0,n-1) FORLL(j,0,n-1)addto(re,mul(abs(a[i]-b[j]),mul(Get_Combination(i+j,i),Get_Combination((n-i-1)+(n-j-1),(n-i-1)))));cout << re << endl;
}