传送门: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 都是非负整数,且与题目要求相符,就视为正确。如有多解,输出任意一解。

样例

input
2
3
3 5 6
4
3 4 5 5 6 7
output
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】的更多相关文章

  1. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】

    任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...

  2. 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 秒 内存限制:  ...

  3. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  4. 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( ...

  5. EOJ Monthly 2019.2

    题解 A 回收卫星 #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/s ...

  6. EOJ Monthly 2019.2 (based on February Selection) F.方差

    题目链接: https://acm.ecnu.edu.cn/contest/140/problem/F/ 题目: 思路: 因为方差是用来评估数据的离散程度的,因此最优的m个数一定是排序后连续的,所以我 ...

  7. EOJ Monthly 2019.2 (based on February Selection) D.进制转换

    题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...

  8. EOJ Monthly 2019.3 A

    A. 钝角三角形 单点时限: 3.0 sec 内存限制: 512 MB QQ 小方以前不会判断钝角三角形,现在他会了,所以他急切的想教会你. 如果三角形的三边长分别为 a, b, c (a≤b≤c), ...

  9. eoj monthly 2019.11

    原题 T1 纸条 题目大意: 给出一个长度为n的字符串,其中m位未知,对于每一位未知的字母,有k个备选字母,最终答案为备选字母按字典序排序后的第x个. 题解: 签到题-- 按照题目意思直接写就可以了. ...

随机推荐

  1. [转]Consuming a OData Service in a Client Application (WCF Data Services)

    本文转自:https://msdn.microsoft.com/zh-tw/library/dd728282(v=vs.103).aspx WCF Data Services 5.0   其他版本   ...

  2. MySQL 8.0 压缩包版安装方法

    转自:https://blog.csdn.net/yangs_2012/article/details/80412016 注意: 操作系统:Windows 10 专业版(64位) MySQL版本:my ...

  3. Grid标签计算结果集中的合计行

    方法一: var detailT= grid.gettable("11"); var r=detailT.rows.length; detailT.rows[r-1].cells[ ...

  4. SQL Server UDF to pad a string

    http://www.mssqltips.com/sqlservertip/1738/sql-server-udf-to-pad-a-string/ declare @l varchar(50) se ...

  5. 54个提高PHP程序运行效率的方法(转载)

    原文地址:http://www.jb51.net/article/69677.htm 1. 如果一个方法可静态化,就对它做静态声明.速率可提升至4倍. 2. echo 比 print 快. 3. 使用 ...

  6. C# Winform窗体和控件自适应大小

    1.在项目中创建类AutoSizeForm AutoSizeForm.cs文件代码: using System; using System.Collections.Generic; using Sys ...

  7. JSP / JDK和Apache的配置

    系统环境:Windows7 x64 Ultimate chs 1.首先安装jdk,可以再oracle官网下载到,此处安装jdk6.0版本. 2.配置jdk环境变量: 我的电脑-->属性--> ...

  8. c/c++ 按照行读取文件

    本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题. 但是请一定注意linux和Windows文件格式的区别,比如: 1. 当linux上的代码读取Windows文 ...

  9. 【Jmeter】参数Parameters和Body Data

    在做接口并发测试的时候,才发现Jmeter中的Parameters和Body Data两种参数格式并不是简单的一个是xx=xx,另外一个是json格式的参数 先看一个接口 [post] /api/xx ...

  10. js 生成md5

    原理比较复杂,不过人类区别与其他动物是因为会用工具,所以,把下面代码复制保存一下就好了. <script> var hex_chr = "0123456789abcdef&quo ...