P3401: [Usaco2009 Mar]Look Up 仰望

这道题第一眼还以为是树状数组,于是乎打着打着也是能过的

 1 const maxn=4000001;
 2 var n,i,j,maxx:longint;
 3 h,l:array[0..400001] of longint;
 4 p:array[0..4000000] of longint;
 5 function lowbit(x:longint):longint;
 6 begin
 7   exit(x and (-x));
 8 end;
 9 procedure insert(x,i:longint);
10 var tem:longint;
11 begin
12   tem:=x;
13   while tem<=maxx+1 do
14     begin
15       p[tem]:=i;
16       tem:=tem+lowbit(tem);
17     end;
18 end;
19 function work(x:longint):longint;
20 var tem:longint;
21 begin
22   tem:=maxn;
23   while x>0 do
24     begin
25       if (p[x]<tem) and (p[x]<>0) then tem:=p[x];
26       x:=x-lowbit(x);
27     end;
28   if tem=maxn then exit(0)
29     else exit(tem);
30 end;
31 begin
32   readln(n);
33   for i:=1 to n do
34     begin
35       readln(h[i]);
36       if h[i]>maxx then maxx:=h[i];
37     end;
38   for i:=1 to n do
39     h[i]:=maxx+1-h[i];
40   l[n]:=0;
41   insert(h[n],n);
42   for i:=n-1 downto 1 do
43     begin
44       l[i]:=work(h[i]-1);
45       insert(h[i],i);
46     end;
47   for i:=1 to n-1 do
48     writeln(l[i]);
49   write(l[n]);
50 end.

然而这道题正确解法是 单调栈!!

 1 type
 2   node=record
 3     num,h:longint;
 4   end;
 5 var n,i,j,num,now:longint;
 6 stack:array[0..100001] of node;
 7 h,l:array[0..100001] of longint;
 8 begin
 9   readln(n);
10   for i:=1 to n do
11     readln(h[i]);
12   now:=0;
13   for i:=n downto 1 do
14     begin
15       while (now>0) and (stack[now].h<=h[i]) do
16         dec(now);
17       l[i]:=stack[now].num;
18       inc(now);
19       stack[now].h:=h[i];
20       stack[now].num:=i;
21     end;
22   for i:=1 to n do writeln(l[i]);
23 end.

好吧,差不多,差不多=-=//

(转载请注明出处:http://www.cnblogs.com/Kalenda/)

 

posted @ 2015-09-17 16:25  LovelyMonster丶  阅读(207)  评论(0编辑  收藏  举报