o.boj 1510 在世界中心呼唤爱

注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
 
 
 
在世界中心呼唤爱

Submit: 622    Accepted:142
Time Limit: 3000MS  Memory Limit: 65536K
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


1 2 
1 3 

1 4 


1 -4 



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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值