注:最近这一系列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; }