Yosupo 的模板站 索引
Sweetlemon
2020-06-17 07:41:24
最近出现了一个 [刷模板的网站](https://judge.yosupo.jp/),还挺有趣的。它的每一组测试数据都有名称,可以知道是被什么样的数据卡了(大雾)。
做这个网站的题目,要特别注意,索引基本都是从 $0$ 开始的,要注意换算。
## Sample(入门题)
### [A+B](https://judge.yosupo.jp/problem/aplusb)
就是 A+B。
### [Many A+B](https://judge.yosupo.jp/problem/many_aplusb)
多组数据 A+B,记得开 `long long`。
## Data Structure(数据结构)
### [Associative Array](https://judge.yosupo.jp/problem/associative_array)
维护一个下标范围在 $[0,10^{18}]$ 的数组,支持单点修改和单点查询,操作次数 $10^6$。
这里应该要手写哈希表才是正确的复杂度,而且哈希表一定要手写,因为测试数据里有“unordered_map_killer”(哭)。当然由于时限很大,也可以用 `map` 水过去。
### [Unionfind](https://judge.yosupo.jp/problem/unionfind)
普通并查集,支持连边和查询两点是否连通。
### [Static Range Sum](https://judge.yosupo.jp/problem/static_range_sum)
静态区间和,给定一个数列多次查询区间和。前缀和即可。
### [Static RMQ](https://judge.yosupo.jp/problem/staticrmq)
静态 RMQ,数列长度和查询次数不超过 $5\times 10^5$。
这题数据范围小,并没有变态到需要用笛卡尔树和 $\pm1$ RMQ。
### [Point Add Range Sum](https://judge.yosupo.jp/problem/point_add_range_sum)
单点加区间和,经典树状数组 / 线段树题。
### [Point Set Range Composite](https://judge.yosupo.jp/problem/point_set_range_composite)
单点修改区间复合?这是什么东西?原来是维护 $n$ 个一次函数,支持单点修改和区间的函数复合。
函数复合支持结合律,因此用线段树维护函数就可以了。
### [Range Affine Range Sum](https://judge.yosupo.jp/problem/range_affine_range_sum)
区间仿射变换区间求和?这又是什么东西?原来仿射变换指的是对这个区间应用(apply)一个一次函数,也就是区间乘、区间加之类。
因此只需要写一棵线段树,用懒标记维护每个点“扣押”的一次函数即可。值得一提的是,支持区间加法和乘法双操作的题目用这道题的写法也很方便快捷,无需考虑优先级。
### [Range Chmin Chmax Add Range Sum](https://judge.yosupo.jp/problem/range_chmin_chmax_add_range_sum)
区间取 $\min$、区间取 $\max$、区间加、区间和?区间取 $\min$ 就是给出区间 $[l,r]$ 和常数 $t$,令 $a_i=\min(a_i,t)\ (i\in [l,r])$。
似乎需要用所谓的“吉司机线段树”,维护最大值和次大值、最小值和次小值。不会写就先不写了(哭)。
### [Range Kth Smallest](https://judge.yosupo.jp/problem/range_kth_smallest)
静态区间第 $k$ 小,做法很多,在线的有树套树、可持久化线段树或 Trie 等,离线的有莫队、整体二分等。
### [Vertex Add Path Sum](https://judge.yosupo.jp/problem/vertex_add_path_sum)
树上单点加路径和,可以用 $\pm 1$ dfs 序写。
### [Vertex Add Subtree Sum](https://judge.yosupo.jp/problem/vertex_add_subtree_sum)
树上单点加子树和,可以直接 dfs 序搞定。
### [Persistent UnionFind](https://judge.yosupo.jp/problem/persistent_unionfind)
可持久化并查集,不强制在线。
gitree 水过去啦~
## Graph(图论)
### [Tree Diameter](https://judge.yosupo.jp/problem/tree_diameter)
树的(带权)直径,要求输出这条路径。
两次 dfs 比较方便,但记得 **清空深度数组**(其实只需要清根节点的就好了)。
### [Shortest Path](https://judge.yosupo.jp/problem/shortest_path)
最短路,要求输出这条路径。
Dijkstra 的时候记录一下前驱就好了。同时可以复习一下 [`push_heap`](https://zh.cppreference.com/w/cpp/algorithm/push_heap) 和 [`pop_heap`](https://zh.cppreference.com/w/cpp/algorithm/pop_heap) 的写法
### [Lowest Common Ancestor](https://judge.yosupo.jp/problem/lca)
LCA,当然有很多种做法,比如复习一下树链剖分。
### [Strongly Connected Components](https://judge.yosupo.jp/problem/scc)
输出按缩点后的拓扑序输出强连通分量。写 Tarjan 和拓扑排序即可。
### [Two-Edge-Connected Components](https://judge.yosupo.jp/problem/two_edge_connected_components)
输出边-双连通分量,用 Tarjan 即可。注意,边双的 Tarjan 比较特殊,需要避免“原路返回”;用数组模拟链表实现时可以把走过来的边的编号传进函数,这样就可以方便地判断是否是“原路返回”。
## Math(数学)
### [Convolution](https://judge.yosupo.jp/problem/convolution_mod)
卷积,就是多项式乘法,模数是 $998244353$。NTT 模板,甚至还有“fft_killer”。
### [Inv of Formal Power Series](https://judge.yosupo.jp/problem/inv_of_formal_power_series)
多项式求逆,模数是 $998244353$。
### [Log of Formal Power Series](https://judge.yosupo.jp/problem/log_of_formal_power_series)
多项式对数,模数是 $998244353$。
## String(字符串)
### [Suffix Array](https://judge.yosupo.jp/problem/suffixarray)
后缀数组。
### [Number of Substrings](https://judge.yosupo.jp/problem/number_of_substrings)
子串个数计数,除了后缀排序还要会求 `height`。具体可以参考[我的博客](https://www.luogu.com.cn/blog/Sweetlemon/bucket-radix-suffix-sort)和 [OI-Wiki](https://oi-wiki.org/string/sa/#_13)。