当前位置: 首页 > news >正文

题解 | #B.Distance# 2023牛客暑期多校6

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}) ASBTC(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| aibi

那么换一种角度考虑,对于原多重集 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} aibi×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=0min(i1,j1)Ci1kCj1k=Ci+j2k (范德蒙德卷积)

同理,它们在 S , T \mathbb{S},\mathbb{T} S,T 中的位置后面选 k k k 对数的方案数为 C 2 ∗ n − i − j k C_{2*n-i-j}^k C2nijk
总方案数为 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+j2kC2nijk ,乘以两数之差的绝对值即为它们对答案的总贡献//

预处理组合数,枚举 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;
}
http://www.lryc.cn/news/111731.html

相关文章:

  • 【flink】开启savepoint
  • 【C++】开源:事件驱动网络库libevent配置使用
  • 业务测试——历史数据
  • 【Linux】计算机网络套接字编写
  • Maven-学习笔记
  • WebGL Shader着色器GLSL语言
  • 【Codeforces】 CF468C Hack it!
  • FFmpeg常见命令行(一):FFmpeg工具使用基础
  • Mock.js的基本使用方法
  • TiDB 源码编译之 PD/TiDB Dashboard 篇
  • Vue3描述列表(Descriptions)
  • 【驱动开发day8作业】
  • yxBUG记录
  • uniapp引入inconfont自定义导航栏
  • OSLog与NSLog对比
  • 全网最细,Fiddler修改接口返回数据详细步骤实战,辅助接口测试...
  • Mysql自动同步的详细设置步骤
  • opencv-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
  • jenkins gitlab多分支构建发布
  • 刷题笔记 day8
  • C 语言的表达式
  • C++设计模式创建型之单例模式
  • 杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)
  • MyBatis@Param注解的用法
  • Shader 编程:GLSL 重要的内置函数
  • 浏览器同源策略
  • GD32F103的EXTI中断和EXTI事件
  • 了解 spring MVC + 使用spring MVC - springboot
  • C#中的Invoke
  • Hive终端命令行打印很多日志时,如何设置日志级别