您的位置:首页 > 其它

[hihoCoder] #1306 : 股票价格 解题报告

2016-05-30 11:57 239 查看
题目链接: http://hihocoder.com/problemset/problem/1306
时间限制:20000ms
单点时限:2000ms
内存限制:256MB


描述

小Hi最近在分析一支股票的价格走势,他需要一个程序来辅助分析。这个程序会接收3种消息(指令):
价格信息,格式是P timestamp price:表示这支股票在 timestamp 时刻价格是 price。
删除价格指令,格式是R timestamp:随着时间推移,小Hi会积累越来越多的价格数据。一些老旧的数据会变得不重要。这个指定会删除 timestamp 以前(包括 timestamp 时刻)的价格数据。
价格查询指令,格式是Q:小Hi希望程序返回这只股票最高、最低和最近的价格。注意已经被删除的价格不应该被统计。
给定一个包含以上3种信息(指令)的序列,你能否帮助小Hi完成这个程序呢?


输入

第1行包含一个整数 N (1 ≤ N ≤ 500000),表示消息(指令)序列的长度。
第2 - N+1行,每行包含一条消息或指令。
输入保证价格信息是按照 timestamp 升序排列的,并且出现的 timestamp 和价格小于100000000。


输出

对于输入中每一条价格查询指令,输出当时最高、最低和最近的价格。

样例输入
10
P 1 77
P 2 73
P 5 70
P 7 74
Q
R 4
Q
P 8 78
R 5
Q


样例输出
77 70 74
74 70 74
78 74 78


思路: 因为涉及到删除以前某个时间以前的信息, 并且还要统计最高和最低的股票价格, 因此可以用一个map来保存以时间为key的股票价格, 然后以二叉搜索数set保存以股票价格和时间的对. 这样做的好处是map是本身有序的, 这样当我们要删除信息的时候最前面的就是最早的股票信息, 然后我们从map中拿到要删除的股票信息到set中查找要删除的股票, 因为是二叉搜索树, 所有其查找和删除时间复杂度都是O(log n), 还是可以接受的.

代码如下:

/*************************************************************************
> File Name: stock.cpp
> Author: Maoting Ren
> Mail: mren@g.clemson.edu
> Created Time: Sun 22 May 2016 01:28:27 AM EDT
************************************************************************/

#include<iostream>
#include<set>
#include<map>
using namespace std;

int main()
{
int N, time, price, curTime;
char ch;
set<pair<int, int> > st;
map<int, int> hash;
cin>>N;
for(int i =0; i< N; i++)
{
cin>>ch;
if(ch == 'P')
{
cin >> time >> price;
st.insert(make_pair(price, time));
hash[time] = price;
curTime = time;
}
else if(ch == 'Q')
cout << st.rbegin()->first << " " << st.begin()->first << " " << hash[curTime] << endl;
else if(ch == 'R')
{
int dtime;
cin >> dtime;
while(hash.begin()->first<= dtime)
{
st.erase(make_pair(hash.begin()->second, hash.begin()->first));
hash.erase(hash.begin());
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hihoCoder