ex_sbst_size.dpr

来自「tongji acm-online judge solution」· DPR 代码 · 共 111 行

DPR
111
字号
{
	Method:
	Static BST based on Value
}
program Ural_1316(Input,Output);
const
	MaxN=100000;
	MaxSize=1000000;
type
	TIndex=Longint;
	TCount=Int64;
	TStatic_BST=array[1..MaxSize]of TIndex;
var
	Tree:TStatic_BST;
	Total:TCount;

procedure BST_Modify(Value,Delta:TIndex);
var
	Left,Right,Mid:TIndex;
begin
	Left:=1;
	Right:=MaxSize;
	while Left<=Right do //WA 1 times, don't lose the "="!
	begin
		Mid:=(Left+Right) div 2;
		if Value<Mid then
			Right:=Mid-1
		else if Value>Mid then
		begin
			Inc(Tree[Mid],Delta);
			Left:=Mid+1
		end
		else
		begin
			Inc(Tree[Mid],Delta);
			Break;
		end;
	end;
end;
function BST_Count(Value:TIndex):TIndex;
var
	Left,Right,Mid:TIndex;
begin
	Left:=1;
	Right:=MaxSize;
	Result:=0;
	while Left<=Right do
	begin
		Mid:=(Left+Right) div 2;
		if Value<Mid then
		begin
			Inc(Result,Tree[Mid]);
			Right:=Mid-1
		end
		else if Value>Mid then
			Left:=Mid+1
		else
		begin
			Inc(Result,Tree[Mid]);
			Break;
		end;
	end;
end;
procedure ReadWord(var St:String);
var
	Ch:Char;
begin
	St:='';
	repeat
		Read(Ch);
		if not (('A'<=Ch) and (Ch<='Z')) then Break;
		St:=St+Ch;
	until Eoln;
end;
function Min(A,B:TIndex):TIndex;
begin
	if A<B then 
		Result:=A
	else
		Result:=B;
end;
procedure Main;
var
	Price,Times:TIndex;
	Tmp:Extended;
	St:String;
begin
	Total:=0;
	FillChar(Tree,SizeOf(Tree),0);
	while true do
	begin
		ReadWord(St);
		if St='QUIT' then Break;
		Read(Tmp);
		Price:=Round(Tmp*100);
		if St='BID' then
			BST_Modify(Price,1)
		else if St='DEL' then
			BST_Modify(Price,-1)
		else if St='SALE' then
		begin
			Read(Times);
			Inc(Total,Min(Times,BST_Count(Price)));
		end;
		Readln;
	end;
	Writeln(Total/100:0:2);
end;
begin
	Main;
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?