// 单调栈:找左边最近比它小的数 for (int i = 0; i < n; i++) { while (tt && stk[tt] >= a[i]) tt--; if (!tt) cout << -1 << ' '; else cout << stk[tt] << ' '; stk[++tt] = a[i]; }
// 单调队列:滑动窗口最小值 for (int i = 0; i < n; i++) { while (hh <= tt && q[hh] < i - k + 1) hh++; while (hh <= tt && a[q[tt]] >= a[i]) tt--; q[++tt] = i; if (i >= k - 1) cout << a[q[hh]] << ' '; }
KMP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
for (int i = 2, j = 0; i <= n; i++) { while (j && p[i] != p[j + 1]) j = ne[j]; if (p[i] == p[j + 1]) j++; ne[i] = j; }
for (int i = 1, j = 0; i <= m; i++) { while (j && s[i] != p[j + 1]) j = ne[j]; if (s[i] == p[j + 1]) j++; if (j == n) { cout << i - n << ' '; j = ne[j]; } }
voidmerge(int a, int b){ a = find(a), b = find(b); if (a != b) { p[a] = b; sz[b] += sz[a]; } }
堆
1 2 3 4 5 6 7 8 9
voiddown(int u){ int t = u; if (u * 2 <= sz && h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= sz && h[u * 2 + 1] < h[t]) t = u * 2 + 1; if (u != t) { swap(h[u], h[t]); down(t); } }