解题报告 问题1

1. 题目 1.Problem1 首先,读入一个数n,n代表了下面的操作数,从第2至第n+1 行,每行有一个字符ch和一个数字q,若数字为i,代表将数字q加入数字序列中;若数字为f,代表让你找到数字序列中第q大的数字为多少(保证序列中至少为q个数字,即不会出现误解的情况)。

输入样例:

2

i 1

f 1

输出样例

1

50%数据,n<=5000; 100%数据 n<=25 0000

题目实质

乍看,是一模拟。 事实上,模拟的都报 0 。 算法 Quicksort 过 5 个点。 Bst (二叉排序树),全点。 剩下的,就不用再说了吧。 注意事项 哥们,不要以为第一题就不会考你数据结构。

代码 Bst + 模拟链表 (魂之挽歌)

program test1;

type tree=record

x:longint;

l,r,z,y:longint;

end;

var a:array[0..500000]of tree;

i,j,n,k,tot:longint;

c,ch:char;

procedure insert(i,j:longint);

begin

if a[j].x<a[i].x then

begin

inc(a[i].z);

if a[i].l=0 then a[i].l:=j else insert(a[i].l,j);

end

else

begin

inc(a[i].y);

if a[i].r=0 then a[i].r:=j else insert(a[i].r,j);

end;

end;

procedure find(i,x:longint);

var t:longint;

begin

if x=a[i].y+1 then

begin

writeln(a[i].x);

exit;

end;

if a[i].y>=x then find(a[i].r,x) else find(a[i].l,x-a[i].y-1);

end;

begin

assign(input,'problem1.in');reset(input);

assign(output,'problem1.out');rewrite(output);

readln(n);

readln(c,ch,k);

a[1].x:=k;tot:=1;

for i:=2 to n do

begin

readln(c,ch,k);

if c='i' then

begin

inc(tot);

a[tot].x:=k;

insert(1,tot);

end

else

find(1,k);

end;

close(input);close(output);

end.

posted @ 2011-10-17 14:41  木小漾  阅读(236)  评论(0编辑  收藏  举报