[关闭]
@Falsyta 2016-07-08T12:24:03.000000Z 字数 3206 阅读 1332

在此处输入标题

未分类


Treap

  1. # define u t[x]
  2. # define lc ch[0]
  3. # define rc ch[1]
  4. # define tc ch[d]
  5. # define vc ch[!d]
  6. struct Tr {
  7. int ch[2], w;
  8. unsigned pri;
  9. void set (int _w) { w = _w, pri = my_rand (); }
  10. };
  11. void rot (int &x, bool d) { int y = u.tc; u.tc = o.vc, o.vc = x; upd (x); upd (x = y); }
  12. void ins (int &x, int w) {
  13. if (!x) { t[++ tsz].set (w); return; }
  14. if (u.w == w) return;
  15. bool d = w > u.w;
  16. ins (u.tc, w);
  17. t[u.tc].pri > u.pri ? rot (x, d) : upd (x);
  18. }
  19. void del (int &x, int w) {
  20. assert (x);
  21. if (u.w == w) {
  22. bool d = urtc.pri > ulfc.pri;
  23. if (!u.tc) { x = 0; return; }
  24. rot (x, d), del (u.vc, w);
  25. } else del (u.ch[w > u.w], w);
  26. upd (x);
  27. }
  1. # define u t[x]
  2. # define o t[y]
  3. # define p u.par
  4. # define lc ch[0]
  5. # define rc ch[1]
  6. # define tc ch[d]
  7. # define vc ch[!d]
  8. int sgn (int x) { return t[p].rc == x ? 1 : t[p].lc == x ? 0 : -1; }
  9. void sc (int x, int y, bool d) { u.tc = y, o.par = x; }
  10. void fix (int x) { if (~sgn (x)) fix (p); dw (x); }
  11. void rot (int x, bool d) {
  12. int y = p, z = o.par;
  13. if (~sgn (y)) sc (z, x, sgn (y)); else p = z;
  14. sc (y, u.vc, d), sc (x, y, !d), upd (y);
  15. }
  16. int splay (int x) {
  17. fix (x); int t0, t1, y;
  18. while (~(t0 = sgn (x))) {
  19. if (~(t1 = sgn (y = p))) rot (t0 ^ t1 ? x : y, t0), rot (x, t1);
  20. else rot (x, t0);
  21. }
  22. return upd (x), x;
  23. }
  24. int acs (int _x) { for (int x = _x, y = 0; x; upd (y = x), x = p) splay (x), u.rc = y; return splay (_x); }
  25. # define us t[acs (x)]
  26. void evt (int x) { us.frev (); }
  27. void link (int x, int y) { evt (x), p = y; }
  28. void cut (int x) { t[us.lc].par = 0, u.lc = 0; }
  29. void cut (int x, int y) { evt (x), cut (y); }

KD-Tree

  1. # define u t[x]
  2. # define lc ch[0]
  3. # define rc ch[1]
  4. struct Kd { int ch[2], minX, maxX, minY, maxY; };
  5. int build (int l, int r, bool d) {
  6. if (l > r) return 0;
  7. int x = (l + r) >> 1;
  8. FOR (i, l, r) {
  9. u.minX = min (u.minX, p[i].x);
  10. u.maxX = max (u.maxX, p[i].x);
  11. u.minY = min (u.minY, p[i].y);
  12. u.maxY = max (u.maxY, p[i].y);
  13. }
  14. nth_element (p + l, p + x, p + r + 1, d ? cmpY : cmpX);
  15. u.lc = build (l, x - 1, !d);
  16. u.rc = build (x + 1, r, !d);
  17. return x;
  18. }

Leftist Heap

  1. # define u t[x]
  2. # define o t[y]
  3. # define ulfc u.lc
  4. # define urtc u.rc
  5. struct Le { int lc, rc, d; };
  6. int merge (int x, int y) {
  7. if (!x || !y) return x + y;
  8. if (u.w > o.w) swap (x, y);
  9. u.rc = merge (u.rc, y);
  10. if (ulfc.d < urtc.d) swap (u.lc, u.rc);
  11. u.d = urtc.d + 1;
  12. return x;
  13. }

Tarjan

SCC

  1. void tarjan (int x) {
  2. low[x] = dfn[x] = ++ dsz;
  3. REP_G (i, x) {
  4. if (!dfn[v]) tarjan (v), low[x] = min (low[x], low[v]);
  5. else if (!del[v]) low[x] = min (low[x], dfn[v]);
  6. }
  7. if (dfn[x] == low[x]) {
  8. ++ bsz; int y;
  9. do { bel[y = stk[top --]] = bsz, del[y] = true; } while (y != x);
  10. }
  11. }

Undirected Graph

  1. void tarjan (int x, int fi) {
  2. REP_G (i, x) if (i != fi) {
  3. if (!dfn[v]) tarjan (v, i ^ 1), low[x] = min (low[x], low[v]);
  4. else if (!del[v]) low[x] = min (low[x], dfn[v]);
  5. }
  6. }

Suffix Array

  1. void build_sa (char *s) {
  2. REP (i, n) ++ c[x[i] = s[i]];
  3. REP (i, m) c[i] += c[i - 1];
  4. REP_D (i, n) sa[c[x[i]] --] = i;
  5. for (int k = 2, p = 0; m < n; k <<= 1, m = p) {
  6. REP (i, m) c[i] = 0; c[0] = p = 0;
  7. REP (i, n) if (sa[i] - k > 0) y[++ p] = sa[i] - k;
  8. FOR (i, n - k + 1, n) y[++ p] = i;
  9. REP (i, n) ++ c[x[y[i]]];
  10. REP (i, m) c[i] += c[i - 1];
  11. REP_D (i, n) sa[x[y[i]] --] = y[i];
  12. for (p = 1, sa[y[1]] = ; )
  13. }
  14. }

Suffix Automaton

  1. # define u sam[x]
  2. # define v sam[x].tr[c]
  3. # define vn sam[v]
  4. # define o sam[y]
  5. # define w sam[z]
  6. struct Sam { int tr[26], par, l; Sam () { CLR (tr, -1); } };
  7. void init () { sam[ssz = lst = 1].par = -1; }
  8. int extend (int x, int c) {
  9. int z = ++ ssz; w.l = u.l + 1;
  10. for (; x != -1 && v == -1; x = u.par) v = z;
  11. if (x == -1) w.par = 1;
  12. else if (u.l + 1 == vn.l) w.par = v;
  13. else {
  14. int y = ++ ssz, _v = v;
  15. o = vn, o.l = u.l + 1, w.par = vn.par = y;
  16. for (; x != -1 && v == _v; x = u.par) v = y;
  17. }
  18. return z;
  19. }

Fast Fourier Transform

  1. void fft (int *a, int n, int ty) {
  2. for (int i = n >> 1, j = 1, k; j < n - 1; ++ j) {
  3. if (i > j) swap (a[i], a[j]);
  4. for (k = n >> 1; k <= i; k >>= 1) i ^= k;
  5. i ^= k;
  6. }
  7. for (int m = 2; m <= n; m <<= 1) {
  8. int h = m >> 1, wm = pr (g, (mod - 1) / m * (ty == 1 ? 1 : (m - 1)));
  9. for (int i = 0; i < n; i += m) {
  10. int w = 1;
  11. for (int j = i; j < i + h; ++ j) {
  12. int u = a[j], v = 1ll * w * a[j + h] % mod;
  13. a[j] = (u + v) % mod;
  14. a[j + h] = (u - v + mod) % mod;
  15. w = 1ll * w * wm % mod;
  16. }
  17. }
  18. }
  19. if (ty == -1) { int iv = pr (n, mod - 2); REP_0 (i, n) a[i] = 1ll * a[i] * iv % mod; }
  20. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注