点双

注意两个点,特判单点,是 son = 0fa = 0,因为自环,还有弹栈弹到儿子节点处,因为点双不一定由割点弹出。

code
void dfs(int u, int la) {
int son = 0;
low[u] = dfn[u] = ++ dfc;
sta[++ top] = u;
for(int v : A[u]) {
if(!dfn[v]) {
++ son;
dfs(v, u);
cmin(low[u], low[v]);
if(low[v] >= dfn[u]) {
++ scc;
while(true) {
int cur = sta[top];
S[scc].eb(cur);
-- top;
if(cur == v) break;
// 为什么不能用 cur == u 的写法,因为当前点不一定是本割点的出点,8 型
}
}
}
else if(v != la) cmin(low[u], dfn[v]);
}
if(la == 0 && son == 0) S[++ scc].eb(u);
} void tarjan() {
rep(i, 1, n) {
if(!dfn[i]) {
top = 0;
dfs(i, 0);
}
}
}

边双

可以用 pii 存边,注意是边不能走反向,即重边。

code
void dfs(int u, int la) {
stk[++ top] = u;
dfn[u] = low[u] = ++ dfc;
for(pii e : A[u]) {
if(e.fi == la) continue;
int v = e.se;
if(dfn[v]) cmin(low[u], dfn[v]);
else dfs(v, e.fi), cmin(low[u], low[v]);
}
if(dfn[u] != low[u]) return;
++ scc;
while(true) {
int cur = stk[top]; -- top;
S[scc].eb(cur);
if(cur == u) break;
}
} void tarjan() {
rep(i, 1, n) {
if(!dfn[i]) {
dfs(i, -1);
}
}
}

割点

注意根节点的判断。

code
void dfs(int u, int la) {
int son = 0;
dfn[u] = low[u] = ++ dfc;
for(int v : A[u]) {
if(v == la) continue;
if(dfn[v]) cmin(low[u], dfn[v]);
else {
++ son;
dfs(v, u);
cmin(low[u], low[v]);
if(low[v] >= dfn[u]) {
cut[u] = 1;
}
}
}
if(son == 1 && la == 0) cut[u] = 0;
} void tarjan() {
rep(i, 1, n) {
if(dfn[i]) continue;
dfs(i, 0);
}
}

割边

这个好像没有例题?

强连通分量

圆方树

看着 OI-Wiki 打了个板子。

code

```cpp
void dfs(int u) {
low[u] = dfn[u] = ++ dfc;
stk[++ tp] = u;
for(int v : G[u]) {
if(!dfn[v]) {
dfs(v);
cmin(low[u], low[v]);
if(low[v] == dfn[u]) {
++ cnt;
for(int x = 0; x != v; -- tp) {
x = stk[tp];
T[cnt].eb(x);
T[x].eb(cnt);
}
T[cnt].eb(u);
T[u].eb(cnt);
}
}
else cmin(low[u], dfn[v]);
}
}

void solve() {

rd(n, m);

rep(i, 1, m) {

int u, v;

rd(u, v);

G[u].eb(v);

G[v].eb(u);

}

cnt = n;

rep(u, 1, n) if(!dfn[u]) dfs(u), -- tp;

rep(i, n + 1, cnt) {

printf("#id = %d, #size = %d, include:", i - n, (int) T[i].size());

for(int j : T[i]) {

printf("%d ", j);

}

puts("");

}

return;

}


</details> ## 铁人两项
[LUOGU](https://www.luogu.com.cn/problem/P4630)
[LOJ](https://loj.ac/p/2587) 还是照着 OI-Wiki 打了个板子。这个赋点权的方法很厉害啊。 <details>
<summary>code</summary> ```cpp
void dfs(int u) {
low[u] = dfn[u] = ++ dfc;
stk[++ tp] = u;
++ num;
for(int v : G[u]) {
if(!dfn[v]) {
dfs(v);
cmin(low[u], low[v]);
if(low[v] == dfn[u]) {
++ cnt;
for(int x = 0; x != v; -- tp) {
x = stk[tp];
T[cnt].eb(x);
T[x].eb(cnt);
}
T[cnt].eb(u);
T[u].eb(cnt);
val[cnt] = T[cnt].size();
}
}
else cmin(low[u], dfn[v]);
}
}
void dfs1(int u, int la) {
vis[u] = 1;
sz[u] = (u <= n);
for(int v : T[u]) {
if(v == la) continue;
dfs1(v, u);
ans += 2LL * val[u] * sz[u] * sz[v];
sz[u] += sz[v];
}
ans += 2LL * val[u] * sz[u] * (num - sz[u]);
}
void solve() {
rd(n, m);
rep(i, 1, n) {val[i] = -1;}
rep(i, 1, m) {
int u, v;
rd(u, v);
G[u].eb(v);
G[v].eb(u);
}
cnt = n;
rep(u, 1, n) {
if(!dfn[u]) {
num = 0;
dfs(u);
-- tp;
dfs1(u, 0);
}
}
printf("%lld\n", ans);
return;
}

网络流

树链剖分

LCT

主席树

分块

莫队

  • 带修莫队

  • 回滚莫队/不删除莫队

  • 树上莫队

平衡树

  • FHQ Treap

  • Splay

旋转卡壳

打的也不是板子,是 这题

code
ll dist(int i1, int i2) {
return 1LL * (p[i1].x - p[i2].x) * (p[i1].x - p[i2].x) + 1LL * (p[i1].y - p[i2].y) * (p[i1].y - p[i2].y);
}
ll cross(int p0, int p1, int p2) {
return 1LL * (p[p1].x - p[p0].x) * (p[p2].y - p[p0].y) - 1LL * (p[p2].x - p[p0].x) * (p[p1].y - p[p0].y);
}
void In(int a, int b) {
pq.push(dist(a, b));
if((int) pq.size() > k) pq.pop();
}
bool cmp(int a, int b) {
return p[a].x == p[b].x ? p[a].y < p[b].y : p[a].x < p[b].x;
}
int nxt(int x) {return x % top + 1;}
pii calc() {
o_n = 0;
rep(i, 1, n) {
if(!vis[i]) {
o[++ o_n] = i;
}
}
sort(o + 1, o + o_n + 1, cmp);
sta[top = 1] = o[1];
rep(i, 2, o_n) {
while(top > 1 && cross(sta[top - 1], sta[top], o[i]) <= 0) {
-- top;
}
sta[++ top] = o[i];
}
int pre = top;
per(i, o_n - 1, 1) {
while(top > pre && cross(sta[top - 1], sta[top], o[i]) <= 0) {
-- top;
}
sta[++ top] = o[i];
}
-- top;
if(top == 2) return mp(sta[1], sta[2]);
// 前面都是求凸包模板
// 接下来是找直径模板
int cur = 1;
while(cross(sta[top], sta[1], sta[nxt(cur)]) > cross(sta[top], sta[1], sta[cur])) {
cur = nxt(cur);
}
int a = sta[cur], b;
if(dist(sta[cur], sta[1]) > dist(sta[cur], sta[top])) b = sta[1];
else b = sta[top];
// 找以 sta[1], sta[top] 这条边为对边的对踵点
// 一个个找,比较
rep(i, 1, top - 1) {
while(cross(sta[i], sta[i + 1], sta[nxt(cur)]) > cross(sta[i], sta[i + 1], sta[cur])) {
cur = nxt(cur);
}
// 两个都要比较一下
if(dist(sta[cur], sta[i]) > dist(a, b)) {
a = sta[cur];
b = sta[i];
}
if(dist(sta[cur], sta[i + 1]) > dist(a, b)) {
a = sta[cur];
b = sta[i + 1];
}
}
return mp(a, b);
}
void solve() {
rd(n, k);
// printf("%d %d\n", n, k);
rep(i, 1, n) {
rd(p[i].x, p[i].y);
}
rep(i, 1, min(k, n / 2)) {
pii res = calc();
// 处理的是凸包
// 将凸包上所有距离较远的加入
int a = res.fi;
int b = res.se;
In(a, b);
vis[a] = vis[b] = 1;
rep(j, 1, n) {
if(!vis[j]) {
In(a, j);
In(b, j);
}
}
}
printf("%lld", pq.top());
}

点分治

李超线段树

code

NOIP 考前板子复习的更多相关文章

  1. NOIP 考前 队列复习

    BZOJ 1127 #include <cstdio> #include <cstring> #include <iostream> #include <al ...

  2. NOIP 考前 数论复习

    POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; ...

  3. NOIP 考前 数据结构复习

    BZOJ 1455 左偏树即可 #include <cstdio> #define LL long long ; struct Info{LL l,r,v,Dis;}Tree[Maxn]; ...

  4. NOIP 考前DP 复习

    POJ 2533 最长不降子序列 #include <cstdio> ; int a[Maxn],Pos[Maxn],F[Maxn],n,Ans; inline int Max(int x ...

  5. NOIP 考前 Tarjan复习

    POJ 1236 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 第一个就是缩点之后有多少 ...

  6. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  7. Noip前的大抱佛脚----Noip真题复习

    Noip前的大抱佛脚----Noip真题复习 Tags: Noip前的大抱佛脚 Noip2010 题目不难,但是三个半小时的话要写四道题还是需要码力,不过按照现在的实力应该不出意外可以AK的. 机器翻 ...

  8. NOIP考前划水

    NOIP考前划水 君指先跃动の光は.私の一生不変の信仰に.唯私の超電磁砲永世生き! 要开始背配置了? 3行不谢. (setq c-default-style "awk") (glo ...

  9. NOIP 考前 并查集复习

    POJ 1182 把一个点拆成x,x+n,x+2*n,x吃y可以表示认为x,y+n是一类的,x+n,y+2*n是一类,x+2*n,y是一类. #include <cstdio> ; ],n ...

  10. NOIP考前复习-数制转换,数论模板与文件读写

    数制转换有两种题型,一般一题,分值1.5分. 题型一:R进制转十进制 解法就是:按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1. 纯整数的情况: (11010110)2 = 1× ...

随机推荐

  1. Oracle plsql中文字段乱码,where条件中文字段搜不到结果集

    设置系统环境变量 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK

  2. Nuxt框架中内置组件详解及使用指南(四)

    title: Nuxt框架中内置组件详解及使用指南(四) date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要:本文详细介绍了Nu ...

  3. 前端开发-- Webpack 代码分割和懒加载技术

    在现代前端开发中,优化应用性能是一个至关重要的任务.Webpack 作为一个强大的打包工具,为我们提供了代码分割和懒加载的功能,可以显著提升应用的加载速度和用户体验.本文将深入解析 Webpack 的 ...

  4. 如何做好一场NPS调研?

    我们在工作中经常遇到的一个词,那就是"产品NPS调研".当部分项目缺少专业的用研人员时,设计师.产品经理则经常会接受上级的要求,投身于NPS调研工作. 笔者也曾在2022年的某天突 ...

  5. 说说XXLJob分片任务实现原理?

    XXL Job 是一个开源的分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展的分布式任务调度框架. 这两天咱们开发的 AI Cloud 项目中,也使用到了 XXL Job 来执行 ...

  6. [oeasy]python0135_命名惯用法_name_convention

    命名惯用法 回忆上次内容 上次 了解了isidentifier的细节 关于 关键字 关于 下划线   如何查询 变量所指向的地址? id   如何查询 已有的各种变量? locals   如果 用一个 ...

  7. [oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI

    光标位置 回忆上次内容 上次讲了 三引号的输出 三引号中 回车和引号 都会 被原样输出 \ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗? \e是 干什么的? 回忆转 ...

  8. 玄机-第二章日志分析-apache日志分析

    前言 出息了,这回0元玩玄机了,因为只是日志分析,赶紧导出来就关掉(五分钟内不扣金币) 日志分析只要会点正则然后配合Linux的命令很快就完成这题目了,非应急响应. 简介 账号密码 root apac ...

  9. Pandas库学习笔记(3)---Pandas Series

    Pandas Series Pandas Series基本操作 pandas.Series Series结构如下: pandas.Series(data, index, dtype, copy) 构造 ...

  10. 计算复杂性学习笔记(TCS笔记)

    感觉最近太摆了,每天很空虚,不愿意搞应试那一套,还是得学点东西.还是准备一边学tcs一边搞搞oi好打icpc,搞这个纯属兴趣,也是填个坑.最近进了一个初中生建的数学交流群,感觉群里初中生也很厉害,开始 ...