#include <vector>
#include <map>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstdio>
#include <sstream>
#include<iostream>
#include<iomanip>
#include<stack>
#include<set>
#include<iterator>
#include<utility>
#include<unordered_map>
#include<queue>
#include<cstring>
#include <list>
#include<deque>
#include <string>
using namespace std;
vector<pair<bool,int>>orders;
vector<int>sizelist;
map<pair<bool,int>,int>sizemap;
map<pair<bool,int>,vector<int>>pricetoith;
template<typename T1,typename T2>
void solve(T1 &ask,T2 &bid,int &size,int &price,bool isask,int i)
{
pair<bool,int>p(isask,price);
while(ask.size()>0&&
(*ask.begin()<=price&&isask==0||*ask.begin()>=price&&isask==1)
&&size>0)
{
pair<bool,int>p2(1-isask,*ask.begin());
int tradesize=min(sizemap[p2],size);
int toprice=*ask.begin();
if(tradesize>=sizemap[p2])
ask.erase(ask.begin());
if(sizemap[p2]>0)
{
size-=tradesize;
sizemap[p2]-=tradesize;
if(sizemap[p2]==0)
sizemap.erase(p2);
}
for(auto iter=pricetoith[p2].begin();iter!=pricetoith[p2].end()&&tradesize!=0;)
{
int curtradesize=min(sizelist[*iter],tradesize);
if(sizelist[*iter]<=tradesize)
{
tradesize-=sizelist[*iter];
sizelist[*iter]=0;
iter=pricetoith[p2].erase(iter);
}
else
{
sizelist[*iter]-=tradesize;
tradesize=0;
}
if(curtradesize!=0)
cout<<"TRADE "<<curtradesize<<" "<<toprice<<endl;
}
}
if(size>0)
{
bid.insert(price);
sizemap[p]+=size;
pricetoith[p].push_back(i);
}
sizelist.push_back(size);
orders.push_back(p);
}
template<typename T>
void deleteelem(T&s,int key)
{
s.erase(s.find(key));
}
template<typename T>
void printQueue(bool isask,T s)
{
if(s.empty())
cout<<"[]";
else
{
int prev,cur;
prev=-1;
while(!s.empty())
{
cur=*s.begin();
if(cur!=prev)
{
pair<bool,int>p(isask,*s.begin());
if(sizemap.count(p)>0&&sizemap[p]>0)
{
for(auto iter=pricetoith[p].begin();iter!=pricetoith[p].end();++iter)
{
if(sizelist[*iter]>0)
cout<<"("<<sizelist[*iter]<<","<<*s.begin()<<")";
}
}
}
prev=cur;
s.erase(s.begin());
}
}
cout<<endl;
}
int main()
{
//freopen("../input.txt", "r", stdin);
//freopen("../output.txt", "w", stdout);
int num;
int first=1;
while(cin>>num)
{
//cout<<"times: "<<first<<endl;
set<int,greater<int>>bid;
set<int>ask;
for(auto it=pricetoith.begin();it!=pricetoith.end();++it)
{
it->second.clear();
}
orders.clear();
sizelist.clear();
sizemap.clear();
pricetoith.clear();
if(first!=1)
cout<<endl;
++first;
for(int i=0;i<num;++i)
{
string instruct;
cin>>instruct;
//cout<<i+1<<endl;
if(instruct=="CANCEL")
{
int ith;
cin>>ith;
--ith;
if(sizemap.count(orders[ith])>0)
{
sizemap[orders[ith]]-=sizelist[ith];
sizelist[ith]=0;
if(sizemap[orders[ith]]==0)
{
sizemap.erase(orders[ith]);
if(orders[ith].first==0)
deleteelem(bid,orders[ith].second);
else
deleteelem(ask,orders[ith].second);
}
}
orders.push_back(make_pair(0,-1));
sizelist.push_back(-1);
}
else
{
int size,price;
cin>>size>>price;
bool isask=0;
if(instruct=="BUY")
{
solve(ask,bid,size,price,isask,i);
}
else
{
isask=1;
solve(bid,ask,size,price,isask,i);
}
}
cout<<"QUOTE ";
if(bid.empty())
cout<<"0 0";
else
cout<<sizemap[make_pair(0,*bid.begin())]<<" "<<*bid.begin();
cout<<" - ";
if(ask.empty())
cout<<"0 99999";
else
cout<<sizemap[make_pair(1,*ask.begin())]<<" "<<*ask.begin();
cout<<endl;
//cout<<"Buy Queue: ";
//printQueue(0,bid);
//cout<<"Sell Queue: ";
//printQueue(1,ask);
}
}
}
紫书UVa1598
最新推荐文章于 2022-07-30 16:21:18 发布