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

[题解]P3540 [POI 2012] SQU-Squarks

思路

\(s_i\) 从小到大排序,考虑从小到大确定 \(a_i\)。注意到若确定了 \(a_1,\dots,a_i\),则一定可以确定 \(a_{i + 1}\),因为记可重集 \(S_i = \{s_1,\dots,s_n\} \setminus \{a_j + a_k \mid 1 \leq j < k \leq i\}\),显然有 \(a_1 + a_{i + 1} = \min\{S_i\}\)

那么若能确定 \(a_1\) 的取值,就能还原出整个 \(a\) 序列。不难发现 \(s_1 = a_1 + a_2,s_2 = a_1 + a_3\),此时若能找到一个 \(s_i\) 满足 \(s_i = a_2 + a_3\) 就能直接得到 \(a_1\) 的取值。因为只有 \(a_1 + a_k\) 有可能 \(\leq a_2 + a_3\),因此满足条件的 \(s_i\) 一定有 \(i \leq n\),不妨直接枚举 \(a_2 + a_3\) 的值。

实现上可以用一个 multiset 时刻维护 \(S_i\),复杂度 \(\Theta(n^3 \log n)\),可能需要卡常才能过。由于每次只需要求 \(\min\{S_i\}\),并且一定有 \(S_{i + 1} \subseteq S_i\),所以可以直接用一个桶维护这个元素是否还在集合中,再用一个指针扫,能做到 \(\Theta(n^3)\)

Code

#include <bits/stdc++.h>
#define re registerusing namespace std;const int N = 310,M = N * N;
int n,m;
int arr[M],p[N];
vector<vector<int>> ans;inline int read(){int r = 0,w = 1;char c = getchar();while (c < '0' || c > '9'){if (c == '-') w = -1;c = getchar();}while (c >= '0' && c <= '9'){r = (r << 3) + (r << 1) + (c ^ 48);c = getchar();}return r * w;
}int main(){n = read(),m = n * (n - 1) / 2;for (re int i = 1;i <= m;i++) arr[i] = read();sort(arr + 1,arr + m + 1);for (re int i = 3;i <= n;i++){if (i > 3 && arr[i] == arr[i - 1]) continue;if ((arr[1] + arr[2] + arr[i]) & 1) continue;unordered_map<int,int> mp;for (re int j = 1;j <= m;j++) mp[arr[j]]++;p[1] = (arr[1] + arr[2] + arr[i]) / 2 - arr[i];p[2] = (arr[1] + arr[2] + arr[i]) / 2 - arr[2];p[3] = (arr[1] + arr[2] + arr[i]) / 2 - arr[1];mp[p[1] + p[2]]--,mp[p[1] + p[3]]--,mp[p[2] + p[3]]--;for (re int j = 4,id = 1;j <= n;j++){while (id <= m && !mp[arr[id]]) id++;p[j] = arr[id] - p[1];for (re int k = 1;k < j;k++){int x = p[j] + p[k];if (!mp.count(x) || !mp[x]) goto End;else mp[x]--;}} ans.push_back(vector<int>{});for (re int j = 1;j <= n;j++) ans.back().push_back(p[j]);End:;} printf("%d\n",ans.size());for (vector<int> v:ans){for (int x:v) printf("%d ",x);puts("");}return 0;
}
http://www.jsqmd.com/news/330114/

相关文章:

  • 山东配镜大揭秘!专业靠谱店铺全搜罗
  • 3家宝藏眼科精细检查机构盘点!精准筛查+专家护航,眼健康别踩坑
  • 写作压力小了!8个AI论文写作软件深度测评:MBA毕业论文+开题报告必备工具推荐
  • 验光配镜机构大揭秘:别再盲目选择,看完这篇再决定!
  • Java毕设项目推荐-基于vue+springboot的二手交易平台基于SpringBoot的二手交易系统【附源码+文档,调试定制服务】
  • AI模型开发 | 从零部署Deepseek OCR模型,零门槛开发PDF文档解析工具 - 指南
  • 算法黑箱的哲学悬鉴:对“休谟问题当代延续论”的批判性反思与范式重构
  • Java毕设选题推荐:基于SpringBoot的二手商品交易平台基于SpringBoot的二手交易系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 这次终于选对!万众偏爱的AI论文软件 —— 千笔
  • 【课程设计/毕业设计】基于Spring Boot的二手图书交易系统基于SpringBoot的二手交易系统【附源码、数据库、万字文档】
  • 传说中的C++精灵库,专治“C++恐惧症”?
  • 2026必备!一键生成论文工具 千笔ai写作 VS 云笔AI,继续教育写作首选
  • Java计算机毕设之基于SpringBoot的二手交易系统基于vue+springboot的二手交易平台(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设项目推荐-基于SpringBoot实现的智慧就业管理系统基于springboot的大学就业信息管理系统企业信息管理、招聘信息管理【附源码+文档,调试定制服务】
  • 别再乱选!揭秘专业全面验光配镜机构前五
  • 配镜不踩坑!2026高口碑验光配镜机构推荐,家长/学生党必看
  • 验光配镜哪家靠谱?2026实测榜单+避坑指南,看完不花冤枉钱
  • 【课程设计/毕业设计】基于springboot的大学就业信息管理系统学生信息管理、企业信息管理、招聘信息管理、就业意向管理及消息通知功能于一体的综合性平台【附源码、数据库、万字文档】
  • 【计算机毕业设计案例】基于SpringBoot的二手车交易平台系统基于SpringBoot的二手交易系统(程序+文档+讲解+定制)
  • Java毕设项目:基于SpringBoot的二手交易系统(源码+文档,讲解、调试运行,定制等)
  • Apple iWork (Pages, Numbers, Keynote) 15.1 - 文档、电子表格、演示文稿
  • 4家专业全面验光机构深度测评,精准配镜+售后无忧看这篇就够
  • 合肥配镜大揭秘:这几家店凭什么脱颖而出?
  • 【课程设计/毕业设计】基于springboot+vue的个人财务管理系统基于springboot个人财务管理系统【附源码、数据库、万字文档】
  • Java编程基础与面向对象核心概念
  • 从RAG到Agentic RAG:智能检索增强生成的进化之路
  • 题解:CF2081C Quaternary Matrix
  • 如何选择合适的单北斗变形监测系统来保障水库安全?
  • 高空抛物高空坠物天空垃圾高建筑抛物检测数据集VOC+YOLO格式1941张1类别
  • win11设置软件开机自启动 - LI,Yi