import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static int MAXN = 1000001;
public static int[] arr = new int[MAXN];
public static int[] stack = new int[MAXN];
public static int[][] ans = new int[MAXN][2];
public static int n, r;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
n = (int) in.nval;
for (int i = 0; i < n; i++) {
in.nextToken();
arr[i] = (int) in.nval;
}
compute();
for (int i = 0; i < n; i++) {
out.println(ans[i][0] + " " + ans[i][1]);
}
}
out.flush();
out.close();
br.close();
}
public static void compute() {
r = 0;
int cur;
for (int i = 0; i < n; i++) {
while(r>0&&arr[stack[r-1]] >= arr[i]) {
cur = stack[--r];
ans[cur][0] = r > 0? stack[r-1]: -1;
ans[cur][1] = i;
}
stack[r++] = i;
}
while(r > 0) {
cur = stack[--r];
ans[cur][0] = r > 0? stack[r - 1] : -1;
ans[cur][1] = -1;
}
for (int i = n - 2; i >= 0; i--) {
if (ans[i][1] != -1 && arr[ans[i][1]] == arr[i]) {
ans[i][1] = ans[ans[i][1]][1];
}
}
}
}
利用单调栈来求解, 模板题目,单调栈求每个位置左右两侧离当前位置最近,并且值严格大于或者小于的位置,注意有重复值的情况

京公网安备 11010502036488号