链接: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 ≤ Ai ≤ 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.