打 codeforces 用的

我目前的级别大概只需要这些:

ll q_pow(ll a, ll b, ll p) {
	ll ret = 1;
	for (; b; a = a * a % p, b >>= 1) if (b & 1) ret = ret * a % p;
	return ret;
}
ll inv(ll x, ll p) { return q_pow(x, p - 2, p); }
int tree[MAXN];
inline int lowbit(int x) { return x & -x; }
void insert(int pos, int k) { for (; pos <= N; pos += lowbit(pos)) tree[pos] += k; }
int query(int pos) { int ret = 0; for (; pos; pos -= lowbit(pos)) ret += tree[pos]; return ret; }
#define mid ((l + r) >> 1)
#define ZERO 0 //这可能要改
struct data {
    ll x;
    friend data operator+ (const data& l, const data& r) { return data{l.x + r.x}; } //这可能要改
} T[MAXN << 2];
ll tag[MAXN << 2]; // 我好像真没见过 tag 不止一个数的。。
data arr[MAXN];
void cover(int o, int l, int r, ll k) { T[o].x += k * (r - l + 1), tag[o] += k; } //这可能要改
void pushDown(int o, int l, int r) {
    if (tag[o] != ZERO) cover(o << 1, l, mid, tag[o]), cover(o << 1 | 1, mid + 1, r, tag[o]), tag[o] = ZERO;
}
void build(int o, int l, int r) {
    if (l == r) T[o] = arr[l];
    else build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r), T[o] = T[o << 1] + T[o << 1 | 1];
}
void insert(int o, int l, int r, int L, int R, ll K) {
    if (l == L && r == R) cover(o, l, r, K);
    else {
        pushDown(o, l, r);
        if (R <= mid) insert(o << 1, l, mid, L, R, K);
        else if (L > mid) insert(o << 1 | 1, mid + 1, r, L, R, K);
        else insert(o << 1, l, mid, L, mid, K), insert(o << 1 | 1, mid + 1, r, mid + 1, R, K);
        T[o] = T[o << 1] + T[o << 1 | 1];
    }
}
data query(int o, int l, int r, int L, int R) {
    if (l == L && r == R) return T[o];
    else {
        pushDown(o, l, r);
        if (R <= mid) return query(o << 1, l, mid, L, R);
        else if (L > mid) return query(o << 1 | 1, mid + 1, r, L, R);
        else return query(o << 1, l, mid, L, mid) + query(o << 1 | 1, mid + 1, r, mid + 1, R);
    }
}
#undef mid
#undef ZERO
int fa[MAXN][21], dep[MAXN];
void dfs(int u, int ff) {
    fa[u][0] = ff, dep[u] = dep[ff] + 1;
    for (int i = 1; i <= 20; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];
    for (int i = head[u]; i; i = E[i].next) if (E[i].v != ff) dfs(E[i].v, u);
}
int lca(int u, int v) {
    if (dep[u] < dep[v]) swap(u, v);
    for (int i = 20; i >= 0; --i) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
    if (u == v) return u;
    for (int i = 20; i >= 0; --i) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
    return fa[u][0];
}
int fa[MAXN], dep[MAXN], siz[MAXN], wson[MAXN], tpo[MAXN], dfn[MAXN], dfncnt;
void dfs1(int u, int ff) {
	fa[u] = ff, dep[u] = dep[ff] + 1, siz[u] = 1;
	for (int i = head[u]; i; i = E[i].next) {
		if (E[i].v == ff) continue; dfs1(E[i].v, u), siz[u] += siz[E[i].v];
		if (siz[E[i].v] > siz[wson[u]]) wson[u] = E[i].v;
	}
}
void dfs2(int u, int ff, int tp) {
	top[u] = tp, dfn[u] = ++dfncnt;
	if (wson[u]) dfs2(wson[u], u, tp);
	for (int i = head[u]; i; i = E[i].next) if (E[i].v != ff && E[i].v != wson[u]) dfs2(E[i].v, u, E[i].v);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值