注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
Description
虽然没看过,但是ACMaryland知道这部电影,因为燕姿那首《我也很想他》。但今天我们不是要探讨这部电影,也不是这首歌,我们要来寻找自己的世界中心:-) 古人曾告诉我们,世界是平的。其实,每个人心中都有自己对世界的定义。经常看到一句话,我和你的世界,就像两条平行线,永远没有交集。于是,ACMaryland决定,定义这个虚拟世界为一条直线。 在这个世界里,ACMaryland想要寻找自己心中的世界中心,因此ACMaryland首先定义了自己所在的位置为0坐标点。然后要如何找到这个中心呢?ACMaryland找到了他的大牛室友,即将飞赴US攻读PHD学位的XiaoXi,XiaoXi所学专业是WSN(不是猥琐男哦),无线传感器网络。 Xiaoxi帮助ACMaryland在世界上布置了很多个传感器,每个传感器将会返回它所在的坐标值。但因为每个传感器返回的时间不一致,Xiaoxi帮助ACMaryland做了一个系统,这个系统支持两种操作: 1、输入两个整数,1 X,接收某个传感器返回的坐标值X; 2、输入一个整数,2,根据当前已收集的坐标值,计算并输出世界中心; 特别注意,ACMaryland定义自己的世界中心为已收集坐标值序列的中位数。 现在,一切都已就绪,一起开始寻找那个世界中心吧,在那未知的中心里呼唤爱情:-)
Input
多组测试数据 对于每组测试数据: 第1行: 一个整数N(1 <= N <= 100,000),表示ACMaryland将会进行的操作次数 第2..N+1行: 每一行表示一次操作(第一次操作肯定是1类型): 1、如果输入两个整数,1 X,接收某个传感器返回的坐标值X; 2、如果输入一个整数,2,根据当前已收集的坐标值,计算并输出世界中心;
Output
如果当前操作输入为一个整数2,则打印输出当前世界中心,注意输出统一保留小数点后一位。 输入的最后是0,表示输入结束,这组数据不用处理。
Sample Input
8
1 2
1 3
2
1 4
2
2
1 -4
2
Sample Output
2.5
3.0
3.0
2.5
Hint
Sample 说明 首先输入两个数2,3,此时序列为{2, 3},输入操作2,根据定义,可得中心为(2+3)/2 = 2.5,打印输出2.5;然后输入坐标4,序列更新为{2,3,4},根据定义,可得中位数为3.0,根据输入的操作,则连续输出两个3.0;最后,输入坐标-4,根据定义,可得中位数为(2+3)/2 = 2.5,输出2.5。 中位数的定义: 对于一个含有m个元素的序列: 如果m为偶数,则中位数为第m/2个元素和第m/2+1个元素的平均值; 如果m为奇数,则中位数为第(m+1)/2个元素的值。
Source
ACMaryland
虽然没看过,但是ACMaryland知道这部电影,因为燕姿那首《我也很想他》。但今天我们不是要探讨这部电影,也不是这首歌,我们要来寻找自己的世界中心:-) 古人曾告诉我们,世界是平的。其实,每个人心中都有自己对世界的定义。经常看到一句话,我和你的世界,就像两条平行线,永远没有交集。于是,ACMaryland决定,定义这个虚拟世界为一条直线。 在这个世界里,ACMaryland想要寻找自己心中的世界中心,因此ACMaryland首先定义了自己所在的位置为0坐标点。然后要如何找到这个中心呢?ACMaryland找到了他的大牛室友,即将飞赴US攻读PHD学位的XiaoXi,XiaoXi所学专业是WSN(不是猥琐男哦),无线传感器网络。 Xiaoxi帮助ACMaryland在世界上布置了很多个传感器,每个传感器将会返回它所在的坐标值。但因为每个传感器返回的时间不一致,Xiaoxi帮助ACMaryland做了一个系统,这个系统支持两种操作: 1、输入两个整数,1 X,接收某个传感器返回的坐标值X; 2、输入一个整数,2,根据当前已收集的坐标值,计算并输出世界中心; 特别注意,ACMaryland定义自己的世界中心为已收集坐标值序列的中位数。 现在,一切都已就绪,一起开始寻找那个世界中心吧,在那未知的中心里呼唤爱情:-)
Input
多组测试数据 对于每组测试数据: 第1行: 一个整数N(1 <= N <= 100,000),表示ACMaryland将会进行的操作次数 第2..N+1行: 每一行表示一次操作(第一次操作肯定是1类型): 1、如果输入两个整数,1 X,接收某个传感器返回的坐标值X; 2、如果输入一个整数,2,根据当前已收集的坐标值,计算并输出世界中心;
Output
如果当前操作输入为一个整数2,则打印输出当前世界中心,注意输出统一保留小数点后一位。 输入的最后是0,表示输入结束,这组数据不用处理。
Sample Input
8
1 2
1 3
2
1 4
2
2
1 -4
2
Sample Output
2.5
3.0
3.0
2.5
Hint
Sample 说明 首先输入两个数2,3,此时序列为{2, 3},输入操作2,根据定义,可得中心为(2+3)/2 = 2.5,打印输出2.5;然后输入坐标4,序列更新为{2,3,4},根据定义,可得中位数为3.0,根据输入的操作,则连续输出两个3.0;最后,输入坐标-4,根据定义,可得中位数为(2+3)/2 = 2.5,输出2.5。 中位数的定义: 对于一个含有m个元素的序列: 如果m为偶数,则中位数为第m/2个元素和第m/2+1个元素的平均值; 如果m为奇数,则中位数为第(m+1)/2个元素的值。
Source
ACMaryland
大三参加校赛决赛最后一题,这题讲究时间,用一般的数据结构,或二分查找,基本都会超时的。
但如果你用两个堆去做的话,便特别简单!
这题告诉我,数据结构很重要!
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
int main()
{
multiset<int> l, r;
multiset<int>::iterator lp, rp;
int N, mid, in, x;
int len, count;
cin >> N;
while (N)
{
l.clear();
r.clear();
cin >> in >> x;
mid = x;
count = 1;
N--;
while (N--)
{
cin >> in;
if (in == 1)
{
cin >> x;
if (count%2)
{
if (x >= mid)
{
l.insert(mid);
r.insert(x);
}
else
{
l.insert(x);
r.insert(mid);
}
}
else
{
lp = l.end();
lp--;
rp = r.begin();
if (x>=*(lp) && x<=*(rp))
mid = x;
else if (x<*(lp))
{
mid = *(lp);
l.erase(lp);
l.insert(x);
}
else if (x>*(rp))
{
mid = *(rp);
r.erase(rp);
r.insert(x);
}
}
count++;
}
else if (in==2)
{
if (count>1)
{
lp = l.end();
lp--;
rp = r.begin();
}
if (count%2)
printf("%.1f\n", (float)mid);
else
printf("%.1f\n", ((float)(*(lp)+*(rp)))/2);
}
}
cin >> N;
}
// system("pause");
return 0;
}
本文介绍了一种使用传感器数据实时计算世界中心位置的方法,并通过维护两个数据结构实现高效的中位数查找,适用于不断变化的数据集。
116

被折叠的 条评论
为什么被折叠?



