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

SGU 485

首先可以观察到,假设序列中三个元素 \(a \geq b \geq c\),那么可以得到

\[a \geq b \Rightarrow ab - bc \geq ab - ac \Rightarrow (a-c)b \geq (b-c)a \\ b \geq c \Rightarrow ab - bc \geq ac - bc \Rightarrow (a-c)b \geq (a-b)c \]

把原序列 X 从小到大排序,那么我们可以知道 \(A_i > C_i > B_i\),这可以由排序不等式可以得到。不妨设 \(C_i > C_{i+1}\),那么要最大化答案,需要 \(A_i > A_{i+1}\)\(B_i < B_{i+1}\)

由于 \(A_i > C_i > C_N > B_N\),所以可以直接钦定 \(B_i\) 为前 N 个位置。剩下只需要考虑 \([N + 1, 3N]\) 上的问题。

考虑两个两个确定位置,设当前已经确定了 \(x\)\((A_i, C_i)\) 的位置,那么由于 \(A_i > C_i\),区间 \([3N - x + 1, 3N]\) 一定都被选走了,这是因为如果中间空了一个位置 \(p\),那么总会有某个 \(A_j < A_i\) 或者 \(C_j < C_i\) 填到 \(p\) 上,不符合我们先前确定的大小关系。同样的,区间 \([N + 1, 2N - x]\) 一定都没被选走,这是因为最坏情况下,\(C_i\)\(2N\) 开始填起,同时如果中间被填了某个位置,也会破坏大小关系。

所以我们实际需要维护的位置只有 \([2N - x + 1, 3N - x]\),长度为 \(N\),这本质上是在 \([N + 1, 3N]\) 上做滑动窗口。时间复杂度 \(O(N 2^N)\),在滑动窗口更新答案的时候可以根据 \(C_i\) 的大小关系剪枝,跑不满所以能过。

参考实现是把 \([N + 1, 3N]\) 从大到小排序。

#include <bits/stdc++.h>
#define fi first
#define se secondusing i64 = long long;
using u64 = unsigned long long;
using PII = std::pair<int, int>;
using std::cin, std::cout, std::cerr, std::vector;int n;
char ppc[(1 << 25) + 2];void init(int n) {ppc[0] = 0;for (int s = 1; s <= n; ++s) {ppc[s] = ppc[s >> 1] + (s & 1);}
}void solve() {vector<int> c(n * 3);for (int i = 0; i < n * 3; ++i) {cin >> c[i];}std::sort(c.begin(), c.end());vector<int> b, a;for (int i = 0; i < n; ++i) {b.push_back(c[i]);}for (int i = n; i < n * 3; ++i) {a.push_back(c[i]);}std::reverse(a.begin(), a.end());vector<int> f((1 << n), 0);for (int s = 0; s < (1 << n) - 1; ++s) {int x = ppc[s];int lst = 0;while ((s >> lst) & 1) {++lst;}int ss = ((s | (1 << lst)) >> 1);for (int i = n - 1; i >= lst; i--) {if ((ss >> i) & 1) {break;}f[ss | (1 << i)] = std::max(f[ss | (1 << i)], f[s] + (a[x + lst] - b[x]) * a[x + i + 1]);}}cout << f[(1 << n) - 1] << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);init(1 << 25);int T = 1;cin >> T; cin >> n;while (T--) {solve();}return 0;
}
http://www.jsqmd.com/news/455094/

相关文章:

  • 4个维度重构移动端体验:Three.js赋能3D小程序开发指南
  • 避坑指南:Canal 1.1.7版本在Windows/Mac下的Docker部署全流程
  • 零基础玩转Nunchaku FLUX.1 CustomV3:从部署到出图,全程可视化操作
  • 万象熔炉·丹青幻境一键部署教程:Ubuntu 20.04环境快速搭建
  • SUPER COLORIZER风格扩展实战:训练自定义色彩风格LoRA
  • TEKLauncher如何重新定义方舟生存进化管理体验?开源工具的技术突破与实战价值
  • GME-Qwen2-VL-2B-Instruct在工业软件中的应用展望:以SolidWorks模型图为案例
  • 从text-overflow到line-clamp:CSS文本截断的完整进化史
  • Windows高DPI缩放坑了你的Qt软件?保姆级设置指南(系统级/程序级)
  • 从Typora迁移到Obsidian必看:图片管理方案对比与平滑过渡技巧
  • 实战应用:基于快马生成集成openclaw的数据抓取与清洗示例项目
  • 南北阁Nanbeige 4.1-3B与Python入门:零基础AI开发指南
  • 用COMSOL模拟双重介质注浆模型:浆液在裂隙与多孔介质中的流动特性研究
  • OWL ADVENTURE数据处理:使用Python进行大规模图像清洗与预处理
  • Tabby终端工具入门指南:Windows/Mac/Linux三平台安装配置详解
  • 从零理解RISC-V调用约定:为什么t0-t6寄存器敢随便用而s0-s11必须保护?
  • 突破教育资源壁垒:tchMaterial-parser工具的技术实现与应用
  • UV-UI框架入门指南:从零开始的跨平台开发之旅
  • TEKLauncher:如何通过智能管理系统实现方舟生存进化的高效配置与运维?
  • 新手福音:在快马平台用Spring AI实现你的第一个AI对话程序
  • GitHub使用全教程:管理你的CLIP-GmP-ViT-L-14应用开发项目
  • BiliDownloader:B站视频资源管理的技术管家
  • Gemma-3-12B-IT与Anaconda环境配置:Python开发最佳实践
  • SenseVoice Small企业应用:法务合同听录→结构化文本自动提取
  • 通达信【波段低吸买入主图】+【龙头出现选股】指标CJM99分享
  • 华为eNSP防火墙Web管理实战:两种AAA验证方式对比与选择建议
  • CodeBuddy IDE实战:30分钟搭建个人博客全流程(含Figma转代码技巧)
  • Stable Diffusion v1.5效果展示:用这些提示词,轻松生成超美风景和人物
  • 计算机毕设选题2026:基于效率优先的选题策略与技术实现路径
  • 黑丝空姐-造相Z-Turbo学术论文插图生成:LaTeX与AI工作流结合