点双

注意两个点,特判单点,是 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. SpringBoot快速插入Mysql 1000万条数据

    导读 有时候为了验证系统瓶颈,需要往数据库表中插入大量数据,可以写sheel脚本插入,前几天为了插入100万条数据,走的sheel脚本(点我直达),插入速度简直无法直视,花了3小时,才插入了10万条, ...

  2. yb课堂实战之订单和播放记录事务控制 《十六》

    开启事务控制 启动类:@EnableTransactionManagement 业务类,或者业务方法@Transactional 默认事务的隔离级别和传播属性 启动类上加注解 Service层加注解

  3. react为什么不用数组的下标来绑定key

    最近在看一本名叫<深入浅出React和Redux>这一书,里面谈到了react的dom更新比对,记录一下. 假设有这么一个组件 <ul> <ListItem text=& ...

  4. BootstrapTable 行内编辑解决方案:bootstrap-table-editor

    最近开发的一个业务平台,是一个低代码业务平台.其中用到的了bootstrap-table组件.但是bootstrap-table自身不带编辑功能. 通过搜索发现,网上大部分的解决方案都是使用x-edi ...

  5. [oeasy]python0135_python_语义分析_ast_抽象语法树_abstract_syntax_tree

    语义分析_抽象语法树_反汇编 回忆 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力   ​   添加图片注释,不超过 140 字(可选)   python究竟是 ...

  6. scratch编程作品-《滚动的物理小球》

    程序说明: <滚动的物理小球>是一款基于Scratch平台开发的小游戏.在这个游戏中,玩家通过按左右方向键来控制一个小球在屏幕上的左右移动.小球在移动过程中,完全遵循物理引擎的规则,如加速 ...

  7. 【Vue】Re21 VueX 第二部分(Mutations)

    一.Mutations携带参数处理 Store状态的更新唯一方式:提交Mutations Mutations包含两部分: 1.字符串的事件类型[TYPE] 2.一个回调函数[HANDLER] 该函数的 ...

  8. 【DataBase】SQL50 Training 50题训练

    原文地址: https://blog.csdn.net/xiushuiguande/article/details/79476964 实验数据 CREATE DATABASE IF NOT EXIST ...

  9. 跨平台字幕制作软件ARCTIME

      官网:http://arctime.cn/

  10. openAI的仿真环境Gym Retro的Python API接口

    如题,本文主要介绍仿真环境Gym Retro的Python API接口 . 官网地址: https://retro.readthedocs.io/en/latest/python.html ===== ...