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

【基础排序】CF - 最优排列Permutator

题目描述

Manuel 和 Felix 在 TeamsCode 比赛前一晚一直在寻找一个有趣的数学题。 他们最终找到了一个问题:

Omer 有两个长度相同的整数数组 aaabbb

他可以重新排列数组 bbb 的顺序,以最小化以下表达式的值:

∑i=0n−1∑j=in−1∑k=ijak⋅bk\sum_{i=0}^{n-1}\sum_{j=i}^{n-1}\sum_{k=i}^{j} a_k \cdot b_k i=0n1j=in1k=ijakbk

换句话说,Omer 想要通过重新排列 bbb,使得对于所有子数组 [i,j][i, j][i,j]∑k=ijak⋅bk\sum_{k=i}^{j} a_k \cdot b_kk=ijakbk 的总和尽可能小。

请你帮助他计算出在最优排列下,这个表达式的最小可能值。

输入格式

第一行输入一个整数 nnn,表示两个数组的长度。

第二行输入 nnn 个整数 a0,a1,…,an−1a_0, a_1, \dots, a_{n-1}a0,a1,,an1,表示数组 aaa

第三行输入 nnn 个整数 b0,b1,…,bn−1b_0, b_1, \dots, b_{n-1}b0,b1,,bn1,表示数组 bbb

输出格式

输出一个整数,表示通过重新排列 bbb 所能得到的最小值

样例 #1

输入

3
5 4 -1
4 3 2

输出

65

样例说明

一种最优的排列方式是将 bbb 重新排列为:b=[3,2,4]b = [3, 2, 4]b=[3,2,4]

此时表达式的值为最小,结果为 656565

数据范围

  • 2≤n≤1052 \le n \le 10^52n105
  • −100≤ai,bi≤100-100 \le a_i, b_i \le 100100ai,bi100

提交链接

Permutator

思路分析

🧩 我们有两个数组 ab, 可以重新排列数组 b 的顺序, 目标是让下式的值尽可能小:

∑i=0n−1∑j=in−1∑k=ijak⋅bk\sum_{i=0}^{n-1} \sum_{j=i}^{n-1} \sum_{k=i}^{j} a_k \cdot b_k i=0n1j=in1k=ijakbk

看上去三重循环非常吓人 😵,但其实我们可以把它“化简”!

🧮 化简推导过程

我们来观察每个 ( ak⋅bka_k \cdot b_kakbk ) 在式子中出现了多少次。

位置 kkk 会被多少个子区间 [i, j] 包含呢?

👉 当左端点 ( i≤ki \le kik ) 且右端点 ( j≥kj \ge kjk) 时,它才会被选中。

左端点 ( iii ) 可以取 ( 1∼k1 \sim k1k),有 ( kkk) 种;
右端点 ( jjj) 可以取 ( k∼nk \sim nkn),有 ( n−k+1n - k + 1nk+1) 种。

所以每个位置 ( kkk ) 的贡献次数是:

ck=k×(n−k+1)c_k = k \times (n - k + 1) ck=k×(nk+1)

于是整个式子就可以改写为:

总和=∑k=1nck⋅ak⋅bk\text{总和} = \sum_{k=1}^{n} c_k \cdot a_k \cdot b_k 总和=k=1nckakbk

🔢 构造新的数组

我们把每个 ( aka_kak) 都乘上它的出现次数,构造新数组:

ak′=ak×k×(n−k+1)a'_k = a_k \times k \times (n - k + 1) ak=ak×k×(nk+1)

于是问题就变成了:重新排列 b,使得:∑ak′⋅bk\sum a'_k \cdot b_kakbk 的值最小。

🧠 重排不等式登场!

根据著名的 重排不等式(Rearrangement Inequality)

  • 如果两个序列同向排序(都升序或都降序) → 点积最大 💥
  • 如果两个序列反向排序(一个升序一个降序) → 点积最小 🧊

因此,我们要:

✅ 把 a' 升序排列
✅ 把 b 降序排列

然后一一配对相乘即可。

💻 代码实现

#include <bits/stdc++.h>
using namespace std;const int maxn = 1e5 + 9;
long long a[maxn], b[maxn];
int n;int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] = a[i] * i * (n - i + 1); // 加权}sort(a + 1, a + n + 1); // a' 升序for (int i = 1; i <= n; i++)cin >> b[i];sort(b + 1, b + n + 1, greater<int>()); // b 降序long long sum = 0;for (int i = 1; i <= n; i++)sum += a[i] * b[i];cout << sum;return 0;
}
http://www.dtcms.com/a/573734.html

相关文章:

  • [RE2] Prog对象(字节码) | Inst指令序列 | 字节映射和指令扁平化
  • 灰系网站网站运营设计
  • C++ STL::vector底层剖析
  • 多线程环境下,线程安全单例模式的方案避坑
  • 深度学习-卷积神经网络LeNet
  • Ubuntu误删libaudit.so.1 导致系统无法正常使用、崩溃
  • 【深度学习5】多层感知机
  • 通过fluent HEC 来发送数据到splunk
  • 二叉树深度解析:核心概念与算法实现
  • 考研408--操作系统--day3--调度调度算法
  • 东莞做网站首选企业铭wordpress 4.5.4 漏洞
  • 消防做ccc去那个网站微信网页版客户端下载
  • 项目实战 | 新建校区网络安全项目:从搭建到交付
  • MHAF-YOLO:用于精确目标检测的多分支异构辅助融合YOLO
  • 从零到上线:Spring Boot 3 + Spring Cloud Alibaba + Vue 3 构建高可用 RBAC 微服务系统(超详细实战)
  • 优秀企业网站模板下载企业网络推广方案怎么做
  • Spring国际化语言切换不生效
  • 跨境S2B2C供应链系统推荐:核货宝外贸分销S2B2C平台深度赋能B端、极致服务C端
  • 【OS笔记24】:存储管理3-分页管理-页表与快表
  • 城乡和住房建设厅网站首页深圳网站建站的公司
  • 湖湘杯网络安全技能大赛参与形式
  • 网站怎么上传模板优化设计七年级上册英语答案
  • C++-19-类和对象
  • 深度学习_原理和进阶_PyTorch入门(2)后续语法2
  • C++ 中string的用法
  • 山东卓商网站建设公司做网站的广告词
  • uView2开发APP实现悬浮按钮
  • 让人做网站需要注意什么条件绍兴建设公司网站
  • OCSSA-VMD-Transformer-LSTM-Adaboost轴承故障诊断MATLAB代码实现
  • 工业园区废水除重金属镍