标签:分析 有用 单调栈 第一个 输出 pre 题目 scan for
const int N = 1e6 + 10;
int st[N], tt = -1;
void push(int x) {
st[++tt] = x;
}
void pop() {
--tt;
}
bool isempty() {
return tt >= 0;
}
void query() {
cout << st[tt] << endl;
}
void solve() {
for(int i = 0; i < n; i++) {
int j = i - 1;
while(j != -1 && st[j] > a[i]) j--;
if(j) printf("%d ", st[j]);
else printf("-1 ");
}
}
i < j
a[i] > a[j]
i < j
a[i] < a[j]
const int N = 1e6 + 10;
int st[N], tt = 0;
void solve() {
for(int i = 0; i < n; i++) {
while(tt && st[tt] >= a[i]) tt--;
if(tt) printf("%d ", st[tt]);
else printf("-1 ");
st[++tt] = a[i];
}
}
const int N = 3e6 + 10; // 根据题目数据范围
int st[N], a[N], ans[N], tt = 0; // 数组模拟的栈从下标为1开始存储
void solve() {
int n; scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = n; i >= 1; i--) {
while(tt && a[st[tt]] <= a[i]) tt -- ; // 删去比当前位置的数小的,剩下第一个比当前的数大的
ans[i] = (tt) ? st[tt]: 0;
st[++tt] = i;
}
for(int i = 0; i < n; i++) printf("%d ", ans[i]);
}
标签:分析 有用 单调栈 第一个 输出 pre 题目 scan for
原文地址:https://www.cnblogs.com/Hot-machine/p/13191638.html