C数列下标 牛客OI赛制测试赛2

链接:https://www.nowcoder.com/acm/contest/185/C
来源:牛客网

给出一个数列 A,求出一个数列B.
其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的数的下标(从1开始计数),没有找到这一个下标  Bi 就为0
输出数列B

输入描述:

第一行1个数字 n (n ≤ 10000)
第二行n个数字第 i 个数字为 Ai (0 ≤ A≤ 1000000000)

输出描述:

一共一行,第 i 个数和第 i+1 个数中间用空格隔开.
题解:虽然直接暴力也能过,但是如果数据大了,就要用单调队列了(不需要二分的,比它大就直接从队列中减到小于等于的)
 1 var
 2 q:array[0..10005,0..2]of longint;
 3 a,b:array[0..100000]of longint;
 4 n,i,j,k:longint;
 5 begin
 6 readln(n);
 7 for i:=1 to n do read(a[i]);
 8 q[1,1]:=a[n];q[1,2]:=n; k:=1;
 9 
10 for i:=n-1 downto 1 do
11  begin
12   while (k>0)and(q[k,1]<=a[i]) do
13    begin
14     dec(k);
15    end;
16   // writeln(q[k,2]);
17    b[i]:=q[k,2];
18    inc(k);
19    q[k,1]:=a[i];
20    q[k,2]:=i;
21  end;
22  for i:=1 to n do
23   write(b[i],' ');
24 end.

 

posted @ 2018-09-08 14:36  jiangyihui  阅读(360)  评论(0)    收藏  举报