退役诈尸(NOIP春季赛赛前复习)

线段树

//P3384 【模板】重链剖分/树链剖分
struct Segment_Tree
{
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lzy(x) seg_tree[x].lazy
#define val(x) seg_tree[x].val
#define mid ((l + r) >> 1)
struct segment_tree
{
ll val, lazy;
}seg_tree[maxn << 1];
void pushup(int rt)
{
return (void)(val(rt) = (val(lc(rt)) + val(rc(rt))) % P);
}
void pushdown(int rt, int l, int r)
{
if(lzy(rt))
{
lzy(lc(rt)) += lzy(rt), lzy(rc(rt)) += lzy(rt);
(val(lc(rt)) += (mid - l + 1) * lzy(rt) % P) %= P;
(val(rc(rt)) += (r - mid) * lzy(rt) % P) %= P;
lzy(rt) = 0;
}
return;
}
void Build(int rt, int l, int r)
{
if(l == r)
{
val(rt) = at[l];
return;
}
Build(lc(rt), l, mid);
Build(rc(rt), mid + 1, r);
pushup(rt);
return;
}
void Updata(int rt, int l, int r, int L, int R, int val)
{
if(L <= l && r <= R)
{
(val(rt) += val * (r - l + 1) % P) %= P, (lzy(rt) += 1ll * val) %= P;
return;
}
pushdown(rt, l, r);
if (L <= mid)
Updata(lc(rt), l, mid, L, R, val);
if (R > mid)
Updata(rc(rt), mid + 1, r, L, R, val);
pushup(rt);
return;
}
ll Query(int rt, int l, int r, int L, int R)
{
if(L <= l && r <= R)
{
return val(rt);
}
pushdown(rt, l, r);
ll ans = 0;
if(L <= mid)
(ans += Query(lc(rt), l, mid, L, R)) %= P;
if(R > mid)
(ans += Query(rc(rt), mid + 1, r, L, R)) %= P;
return ans;
}
}T;

重链剖分

///P3384 【模板】重链剖分/树链剖分
struct SLPF
{
int fa[maxn], dep[maxn], siz[maxn],
id[maxn], son[maxn], top[maxn], cnt;
void Dfs1(int u, int faa, int deep)
{
dep[u] = deep, fa[u] = faa, siz[u] = 1;
fort(u)
{
if(v == faa) continue;
Dfs1(v, u, deep + 1);
siz[u] += siz[v];
if(siz[son[u]] < siz[v])
son[u] = v;
}
return;
}
void Dfs2(int u, int topf)
{
top[u] = topf, at[++ cnt] = a[u], id[u] = cnt;
if(! son[u]) return;
Dfs2(son[u], topf);
fort(u)
{
if(v == fa[u] || v == son[u])continue;
Dfs2(v, v);
}
return;
}
void Updata1(int x, int y, int z)
{
z %= P;
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]])
swap(x, y);
T.Updata(1, 1, n, id[top[x]], id[x], z);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
T.Updata(1, 1, n, id[x], id[y], z);
return;
}
void Updata2(int rt, int z)
{
return (void)(z %= P, T.Updata(1, 1, n, id[rt], id[rt] + siz[rt] - 1, z));
}
ll Query1(int x, int y)
{
ll ans = 0;
while(top[x] != top[y])
{
if(dep[top[x]] < dep[top[y]])
swap(x, y);
(ans += T.Query(1, 1, n, id[top[x]], id[x])) %= P;
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x, y);
(ans += T.Query(1, 1, n, id[x], id[y])) %= P;
return ans;
}
ll Query2(int rt)
{
return T.Query(1, 1, n, id[rt], id[rt] + siz[rt] - 1);
}
}S;

单源最短路

int dis[maxn];
bool vis[maxn];
struct node
{
int u, dis;
bool operator < (const int v)
{
return dis < v.dis;
}
};
void Dijstra(int x)
{
priority_queue <node> q;
memset(dis, INF, sizeof(dis));
dis[x] = 0;
q.push({x, 0});
while(! q.empty())
{
int u = q.top().u; q.pop();
if(vis[u]) continue;
vis[u] = true;
fort(u)
{
if(dis[v] > dis[u] + e[i].dis)
{
dis[v] = dis[u] + e[i].dis;
q.push({v, dis[v]});
}
}
}
return;
}
void Spfa(int x)
{
srand(time(0));
deque <int> q;
memset(dis, INF, sizeof(dis));
dis[x] = 0, vis[x] = true;
q.push_back(x);
while(! q.empty())
{
int u = q.front(); q.pop_front();
vis[u] = false;
fort(u)
{
if(dis[v] > dis[u] + e[i].dis)
{
dis[v] = dis[u] + e[i].dis;
if(! vis[v])
{
int op = rand() % 2;
if(! op)
{
q.push_back(v);
vis[v] = true;
}
else
{
q.push_front(v);
vis[v] = true;
}
}
}
}
}
}

多源最短路

int f[maxn][manx];
void floyd()
{
for (int k = 1; k <= n; ++ k)
{
for (int i = 1; i <= n; ++ i)
{
if(i == k) continue;
for (int j = 1; j <= n; ++ j)
{
if(i == j || j == k) continue;
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
return;
}

posted @   Eakang  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示