EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】
传送门:https://acm.ecnu.edu.cn/contest/126/
C. 唐纳德先生与这真的是签到题吗
单测试点时限: 6.0 秒
内存限制: 1024 MB
唐纳德先生在出月赛的过程中,准备了一个签到题:给定一个长度为 n 的非负整数序列 a1,a2,…,an,对于所有的 i,j (1≤i<j≤n),求出 ai+aj,并对这 n(n−1)2 个数进行排序输出。
很不幸的是,唐纳德先生把题目的输入搞丢了,现在只剩下输出。你能把输入还原出来吗?
输入
输入共 t (1≤t≤300) 组测试数据。
每组测试数据有两行,第一行是一个整数 n (3≤n≤300)。
第二行含有 n(n−1)2 个整数 b1,b2,…,bn(n−1)/2 (b1≤b2≤⋯≤bn(n−1)/2),用空格隔开。
输入保证所有 t 组数据 n 的和不超过 300。
输出
对于每组数据,输出一行 n 个整数 a1,a2,…,an,用空格隔开,表示答案。
输入保证存在至少一组解满足 0≤ai≤109 对 1≤i≤n 成立,但是你输出的解可以不在这个范围内:只要满足 ai 都是非负整数,且与题目要求相符,就视为正确。如有多解,输出任意一解。
样例
2
3
3 5 6
4
3 4 5 5 6 7
1 2 4
1 2 3 4
解题思路:
原题:BZOJ 2797
a1+a2, a1+a3 肯定是给出的 b 序列里最小的那两个。
即 a1+a2 = b1, a1+a3 = b2;
但是三个未知数,我们还需要一条方程才能解。
那么 a2+a3 到底是第几个 b 呢?
暴力枚举 第 3 ~ N 个 b,找出正解 a2+a3;
得到 a2+a3 = bi ( 3 <= i <= N);
如何判断当前枚举的 b 是不是正解 a2+a3 呢?
通过上面三条方程我们可以 解出当前 a2+a3 = bi 情况下的 a1, a2, a3.
那么 把 b 序列中的 a1+a2, a1+a3, a2+a3删掉,最小的肯定是 a1+a4 了
已知 a1 可以求出 a4, 继续把 b 序列里的 a1+a4, a2+a4, a3+a4 删掉,最小的肯定是 a1+a5 了
已知 a1 可以求出 a5。。。。。。。。。
如果这其中任何一个过程出现了 求得的 a 为 负数,说明当前的 a2+a3 不是正解。
如果这其中任何一个过程出现了 在 b 序列里找不到要删除的数,说明当前的 a2+a3 不是正解。
那么怎么维护这个可以删除元素 并且 能自动排序的 b 序列呢
运用 C++ stl 里的 multiset ,一个默认将元素从小到大排序,支持查找 删除的二叉树数据结构。
通过枚举 a2+a3 只要找到一个 可行的 a2+a3 把答案输出即可。
(这道题只需要求一组可行的答案即可,BZOJ 2797 要求所有满足条件的答案,其实就是找到就行 和 全部暴力的区别)
AC code:
#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int MAXN = ;
int N, len;
LL num[MAXN*MAXN];
multiset<LL>s;
LL ans[MAXN]; bool check(LL A23)
{
s.clear();
//printf("len:%d\n", len);
for(int i = ; i <= len; i++){ ///把 题目给的 b 序列 丢进 multiset
//printf("%lld\n", num[i]);
s.insert(num[i]);
} s.erase(s.find(A23)); //删除 a2+a3 //puts("zjy");
if((num[]+num[]+A23)&1LL) return false;
LL tmp = (num[]+num[]-A23)/2LL;
//printf("tmp:%lld\n", tmp);
ans[] = tmp; //a1
ans[] = num[]-tmp; //a2
ans[] = A23-ans[]; //a3
//printf("A23:%lld tmp:%lld ans3:%lld\n", ans[3]);
if(ans[] < || ans[] < || ans[] < ) return false; ///前三个答案有其中一个为 0 即不满足条件
//if(!(ans[1] <= ans[2] && ans[2] <= ans[3] && ans[1] <= ans[3])) return false; LL value = ;
LL it = ;
for(int i = ; i <= N; i++){ ///算出 ai 的答案
value = *s.begin();
ans[i] = value-ans[];
if(ans[i] < ) return false; for(int j = ; j < i; j++){ ///删除掉 ai+a1, ai+a2,这类, 保证 b 序列里最小的是 a1 + ai+1
it = ans[i]+ans[j];
if(s.find(it) == s.end()) return false; /// b 序列里没有 ai+aj 这个数, 即 当前的这组结果无法算出答案序列里的值
s.erase(s.find(it)); ///把 ai+aj 从 b 序列里删除
}
}
return true;
} int main()
{
int T_case;
scanf("%d", &T_case);
while(T_case--){
scanf("%d", &N);
len = (N*(N-))/;
for(int i = ; i <= len; i++){
scanf("%lld", &num[i]);
} for(int i = ; i <= len; i++){
if(i == || num[i] != num[i-]){
if(check(num[i])) {
//printf("A23:%lld\n", num[i]);
break;
}
}
}
//puts("zjy");
//printf("N:%d\n", N); for(int i = ; i <= N; i++){
//printf("i:%d ans:%lld ",i, ans[i]);
printf("%lld ", ans[i]);
}
puts(""); } return ;
}
EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】的更多相关文章
- EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】
任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...
- EOJ Monthly 2019.2 题解(B、D、F)
EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制: ...
- 2019年牛客多校第一场B题Integration 数学
2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- EOJ Monthly 2019.2
题解 A 回收卫星 #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/s ...
- EOJ Monthly 2019.2 (based on February Selection) F.方差
题目链接: https://acm.ecnu.edu.cn/contest/140/problem/F/ 题目: 思路: 因为方差是用来评估数据的离散程度的,因此最优的m个数一定是排序后连续的,所以我 ...
- EOJ Monthly 2019.2 (based on February Selection) D.进制转换
题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...
- EOJ Monthly 2019.3 A
A. 钝角三角形 单点时限: 3.0 sec 内存限制: 512 MB QQ 小方以前不会判断钝角三角形,现在他会了,所以他急切的想教会你. 如果三角形的三边长分别为 a, b, c (a≤b≤c), ...
- eoj monthly 2019.11
原题 T1 纸条 题目大意: 给出一个长度为n的字符串,其中m位未知,对于每一位未知的字母,有k个备选字母,最终答案为备选字母按字典序排序后的第x个. 题解: 签到题-- 按照题目意思直接写就可以了. ...
随机推荐
- 使用eclipse创建maven web项目
1.新建项目: 2.选择模板: 3.输入项目信息: 4.新建的项目结构,发现index.jsp报错,直接删除重新创建一个index.jsp文件后,发现仍然报错,再在pom/xml文件中添加相应的ser ...
- SZU2
CF:Problem 425A 区间暴力,枚举区间.交换选定区间最小值和剩余区间最大值k次. 其实等同于将剩余区间最大k个加到选定区间里,然后排序 #include <iostream> ...
- Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))
在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...
- csharp: datagridview Convert csv file
/// <summary> /// 保存文件 /// 涂聚文 /// 2014-08-29 /// Geovin Du /// </summary> /// <param ...
- js-原始类型和声明变量
** Java的基本数据类型:byte.short.int.long.float.double.char.boolean ** 定义变量 都是用关键字 var(ES6中可以使用const和let来定义 ...
- 什么是APP???APP的开发类型又分哪几种???
开发者们都知道在高端智能手机系统中有两种应用程序: 一种是基于本地(操作系统)运行的APP —-Native App: 一种是基于高端机的浏览器运行的App —-WebApp因为这些高端智能手机(Ip ...
- framework7的改进,以及与vue组合使用遇到的问题以及解决方法 (附vue的原理)
framework7官方提供了vue+framework7的组合包,但是那个包用起来复杂度较高,而且不灵活.听说bug也不少. 所以我想用最原始的方式单独使用vue和framework7. 遇到以下问 ...
- php扩展库
php调用C/C++动态链接库 字数997 阅读28 评论0 喜欢0 本人最近在找实习,移动开发方向.有意者可直接与本人联系.谢谢! 一.简介 一般而言,php速度已经比较快,但是,对于一些较高级开发 ...
- Java 开源博客 Solo 1.4.0 发布 - 简化
Solo 1.4.0 正式发布了!这个版本主要是简化了配置项,修复了一些缺陷并改进了很多细节体验,感谢一直以来关注和支持我们的朋友! 只需一个命令即可启动(不需要安装数据库.部署容器):也可以通过 w ...
- ArcGIS DataStore手册——入门篇
第一章:ArcGIS DataStore入门 1.ArcGIS DataStore简介 ArcGIS DataStore是ArcGIS10.3推出来的一个全新的组件,它是一个关系型数据库管理系统,用于 ...