主要是能分析出这样一个结论:
每个pop根据这个元素上面被压过多少个元素,可以知道他是在前面哪个pop之前被push的。
根据这些信息可以求得每个pop到上一个pop之间有多少个push,最后求个前缀和即可。
#include <stdio.h> const int maxN=1e6+5; int N, g[maxN], h[maxN]; int main() { scanf("%d", &N); for (int i = 1; i <= N; ++i) { scanf("%d", &g[i]); if (g[i]) h[i - g[i]] += 1; else h[i] = 1; } for (int i = 2; i <= N; ++i) h[i] += h[i - 1]; for (int i = 1; i <= N; ++i) printf("%d ", h[i]); puts(""); return 0; }
原文地址:https://www.cnblogs.com/Rosebud/p/9517750.html
时间: 2024-11-05 13:34:50