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

原创 2016年05月30日 11:57:30

题目链接: 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 #1619 : “共同富裕”

题目链接:http://hihocoder.com/problemset/problem/1619解析:看别人的代码才知道,最小步数应该是每一个数到达最小值的步数之和,小的变成大的,小的+1,变相就是...
  • qq_34287501
  • qq_34287501
  • 2017年11月05日 17:39
  • 247

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

题目链接: http://hihocoder.com/problemset/problem/1306 时间限制:20000ms 单点时限:2000ms 内存限制:256MB ...
  • qq508618087
  • qq508618087
  • 2016年05月30日 11:57
  • 429

hiho 1620 股票价格3 [Offer收割]编程练习赛34 Problem B 单调栈

这个题想了好久才做出来,本来感觉要维护一个区间最值的数据结构,然后每次搜索的时候借助那个区间最值帮助剪枝,后来发现好多人都过了,我就觉得这题应该不用那么麻烦,果然,想了一会,维护一个单调栈,贪心就可以...
  • qdbszsj
  • qdbszsj
  • 2017年11月05日 15:41
  • 173

hihocoder 股票价格

题目1 : 股票价格 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi最近在分析一支股票的价格走势,他需要一个程序来辅助分析。这个程序会接收3种消...
  • wyz1251612514
  • wyz1251612514
  • 2017年06月03日 23:38
  • 239

hihocoder 股票价格

题目的本质是给定区间最大值和最小值的动态查找,并且需要支持删除操作。这是一个rmq问题。可以用一个vector保存已插入的股票信息(按照时间排序),并且在插入的时候维护一个区间最大最小信息,删除时候可...
  • huanyingtianhe
  • huanyingtianhe
  • 2016年06月28日 10:08
  • 194

hiho #1306 : 股票价格(stl)

中文题。 解题思路: 用一个multiset维护价格,然后一个list::iterator> >记录时间和对应的价格信息及即可,见代码 代码: #include #inclu...
  • johsnows
  • johsnows
  • 2017年06月12日 13:50
  • 202

Atcoder arc 084 D - Small Multiple(双向队列+抽屉原理)

题目链接:http://arc084.contest.atcoder.jp/tasks/arc084_b D - Small Multiple Time limit...
  • qq_34287501
  • qq_34287501
  • 2017年11月05日 17:33
  • 192

hihocoder #1620 : 股票价格3

题目链接:http://hihocoder.com/problemset/problem/1620解析:维护一棵树,树根里面存(没有找到第一个大于该值的)最小值的编号,一直维护就好了,借鉴大佬得100...
  • qq_34287501
  • qq_34287501
  • 2017年11月05日 17:43
  • 88

hihocoder - 股票价格3 - 维护栈 & 线段树

题目时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN。 小Hi想知道,对于...
  • deaidai
  • deaidai
  • 2017年11月05日 15:58
  • 306

[hihocoder]#1619“共同富裕” && #1620股票价格3

/** * 给定一个数组A1, A2, ... AN,每次操作可以从中选定一个元素Ai,把除了Ai之外的所有元素都加1。 问最少几次操作可以实现“共同富裕”,即数组中所有元素都相等。 例...
  • xy_cpp
  • xy_cpp
  • 2017年11月05日 23:10
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[hihoCoder] #1306 : 股票价格 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)