Atcoder 算法库(ACL) 出了快一年了,一直没仔细看,这两天写 《天才算法少女》 的主线剧情,正好复习一下这个。不过这玩意更新的着实挺慢的,还没我的 Template 算法多。。。不过至少可以和 rng_58 学习一下怎么写 test 。。。
首先讲一下怎么像 STL 一样加入 cpp 的默认头文件,方法当然是编辑编译器的 Search directories。这个库结构非常简单,对于不支持 ACL 的 OJ,估计也可以手动展开一下。
为了推广这个库,rng_58 还准备了两场 ACL contest,用来测试模板。当然这个东西的适用范围还有待观察,毕竟模板的缺点是不能进去魔改,最典型的缺陷可能就是无法给 std::set<int> 里的二叉树节点加卫星数据 size 以实现求第 kth 大这种实用操作。。。?。。。(比如需要加卫星数据的并查集可能也没法搞了)
并查集
– https://vjudge.net/problem/AtCoder-abc181_f
树状数组
等差数列每一项除以 M 下取整的和。(这玩意居然也需要进模板?)
$$\sum_{i = 0}^{N – 1} \lfloor(A \times i + B) / M\rfloor$$
最大流
– https://vjudge.net/problem/AtCoder-agc038_f
– https://atcoder.jp/contests/arc107/tasks/arc107_f
– https://atcoder.jp/contests/abc193/tasks/abc193_f
import sys
from atcoder.maxflow import MFGraph
I = lambda: [int(x) for x in input().split()]
n, m = I()
s = 2*n
t = s+1
G = MFGraph(t+1)
a = I()
b = I()
z = 0
for i in range(n):
bb = abs(b[i])
z += bb
G.add_edge(i, i+n, a[i] + bb)
bb *= 2
if (b[i] < 0):
G.add_edge(i+n, t, bb)
else:
G.add_edge(s, i, bb)
for i in range(m):
x, y = I()
x -= 1
y -= 1
G.add_edge(x+n, y, sys.maxsize)
G.add_edge(y+n, x, sys.maxsize)
print(z-G.flow(s,t))
最小费用最大流
– https://atcoder.jp/contests/agc034/tasks/agc034_d
FFT 卷积
强连通分量
2SAT
后缀数组
里面的实现用的是 sa-is 线性构造算法。
– https://atcoder.jp/contests/abc141/submissions/23884310
– https://atcoder.jp/contests/arc097/tasks/arc097_a
线段树
懒标记线段树
懒标记线段树
Posted by
xiaodao
Category: 日常
Atcoder 算法库(ACL) 出了快一年了,一直没仔细看,这两天写 《天才算法少女》 的主线剧情,正好复习一下这个。不过这玩意更新的着实挺慢的,还没我的 Template 算法多。。。不过至少可以和 rng_58 学习一下怎么写 test 。。。
首先讲一下怎么像 STL 一样加入 cpp 的默认头文件,方法当然是编辑编译器的 Search directories。这个库结构非常简单,对于不支持 ACL 的 OJ,估计也可以手动展开一下。
为了推广这个库,rng_58 还准备了两场 ACL contest,用来测试模板。当然这个东西的适用范围还有待观察,毕竟模板的缺点是不能进去魔改,最典型的缺陷可能就是无法给 std::set<int> 里的二叉树节点加卫星数据 size 以实现求第 kth 大这种实用操作。。。?。。。(比如需要加卫星数据的并查集可能也没法搞了)
并查集
– https://vjudge.net/problem/AtCoder-abc181_f
树状数组
等差数列每一项除以 M 下取整的和。(这玩意居然也需要进模板?)
$$\sum_{i = 0}^{N – 1} \lfloor(A \times i + B) / M\rfloor$$
最大流
– https://vjudge.net/problem/AtCoder-agc038_f
– https://atcoder.jp/contests/arc107/tasks/arc107_f
– https://atcoder.jp/contests/abc193/tasks/abc193_f
import sys
from atcoder.maxflow import MFGraph
I = lambda: [int(x) for x in input().split()]
n, m = I()
s = 2*n
t = s+1
G = MFGraph(t+1)
a = I()
b = I()
z = 0
for i in range(n):
bb = abs(b[i])
z += bb
G.add_edge(i, i+n, a[i] + bb)
bb *= 2
if (b[i] < 0):
G.add_edge(i+n, t, bb)
else:
G.add_edge(s, i, bb)
for i in range(m):
x, y = I()
x -= 1
y -= 1
G.add_edge(x+n, y, sys.maxsize)
G.add_edge(y+n, x, sys.maxsize)
print(z-G.flow(s,t))
最小费用最大流
– https://atcoder.jp/contests/agc034/tasks/agc034_d
FFT 卷积
强连通分量
2SAT
后缀数组
里面的实现用的是 sa-is 线性构造算法。
– https://atcoder.jp/contests/abc141/submissions/23884310
– https://atcoder.jp/contests/arc097/tasks/arc097_a
线段树
懒标记线段树
懒标记线段树
Posted by
xiaodao
Category: 日常