loading...

来吃糖

先放犯错后 be like:

1 return

// 倍增求 lca
int bfs(int x) {
  queue<int> q;
  q.push(x);
  dep[x] = 1;
  while (q.size()) {
    x = q.front(), q.pop();
    for (auto it : G[x]) {
      int y = it.first, z = it.second;
      if (dep[y]) continue;
      dep[y] = dep[x] + 1;
      d[0][y] = z;
      f[0][y] = x;
      q.push(y);
    }
  }
  rep(k, 1, 14)
    rep(x, 1, n)
      f[k][x] = f[k - 1][f[k - 1][x]], d[k][x] = max(d[k - 1][x], d[k - 1][f[k - 1][x]]);
    // here's no result
}

2 998244853

答案对 \(998244853\) 取模。

const int mod = 998244353;

3 pushdown

// 区修区查线段树
struct SGT {
  ...
  int query(int p, int l, int r, int x) {
    if (l == r) return dat(p);
    int mid = (l + r) >> 1;
    return x <= mid ? query(lc(p), l, mid, x) : query(rc(p), mid + 1, r, x);
  }
}

4 测试文件

测试文件 debug 后的代码没有放回提交文件中。

5 模数

// 加和并取模
rep(i, 2, n) {
  ans += gg * a[i] % mod - ff;
  ff = ((ff<<1) + a[i]) % mod;
  gg = (gg<<1|1) % mod;
}

6 模数Ⅱ

int a, b, c;
cin >> a >> b >> c;
cout << ((long long)a * b % mod - (long long)a * c % mod) % mod;

7 并合式发启/轻链剖分

inline void dfs(int x, int fa) {
	sz[x] = 1, L[x] = ++dfc;
	dep[L[x]] = dep[L[fa]] + 1;
	for (auto y : G[x]) {
		if (y == fa) continue;
		dfs(y, x);
		if (!son[x] || sz[son[x]] > sz[y]) son[x] = y;     // 问题出在这里。 
		sz[x] += sz[y];
	}
	R[x] = dfc;
}

将最轻的儿子的子树继承下来。

8 AC 自动机

DP 标记走不到的点一定要把相关点全都标记不能走!!!

	inline void build() {
		queue<int> q;
		if (tr[0][0]) q.push(tr[0][0]);
		if (tr[1][0]) q.push(tr[1][0]);
		while (q.size()) {
			int p = q.front(); q.pop();
			ed[p] |= ed[fail[p]];//一定要加这个
			rep(ch, 0, 1) {
				if (tr[ch][p]) fail[tr[ch][p]] = tr[ch][fail[p]], q.push(tr[ch][p]), ed[tr[ch][p]]|=ed[p];// 一定要加这个
				else tr[ch][p] = tr[ch][fail[p]];
			}
		}
#ifdef DEBUG
		cout << "trie: \n";
		rep(i, 0, tot)
			cout << i << ' ' << tr[0][i] << ", " << tr[1][i] << '\n';
#endif
	}
posted @ 2025-02-11 20:36  goldspade  阅读(12)  评论(0)    收藏  举报