07 2021 档案
摘要:题目来源 luogu. 1. [USACO19DEC] Milk Visits S 简明题意:树上的每个结点都是黑白两种颜色之一,每次询问一条链上是否有某种颜色。 思路: 一道简单的套路题…… 两种颜色可以分开讨论,每次关注一种颜色即可。 加强一下这道题,改成询问一条链上某种颜色结点的个数。 dfs
阅读全文
摘要:字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 开始。 表示字符串 的长度。 对于字符串 ,记其每一个字符分别为 。
阅读全文
摘要:0. 前言 前置知识:二叉查找树(BST)。 我们知道,BST 是会被恶意数据卡成的。(如下图) 树变成了一条链,这很显然不是我们想要的,我们需要找到一种方法来让 BST 保持平衡。 于是我们就有了各式各样的平衡树,而在 OI 中应用最为广泛的就是 Splay 和 fhq_treap
阅读全文
摘要:(水) 一般来说,我们使用BKDRhash还进行字符串的哈希操作。 具体地,我们将字符串看成一个大进制数,然后取模就行了。 code: int hash(string s) { int ans=0,l=s.length(); for(int i=0;i<l;i++)ans=(ans*base%mod
阅读全文
摘要:树上的许多问题都可以用dfs序+线段树予以解决。 轻重链剖分是通过优化dfs的顺序,达到优化时间复杂度的目的。 它可以支持链上加,链上和还有LCA,子树加,子树和。 前置知识:dfs序,树形dp,线段树,没了。 首先给出一些定义: 重儿子:子树大小最
阅读全文
摘要:UVA11987(vjudge) 并查集神题。也是在这里头一次听说了并查集的删除操作。 题目大意: 要求支持3个操作: 合并所在集合; 将移到所在集合; 查询所在集合中元素的个数和元素的和。 如果只有1、3操作,那么这道题就是一道简单的并查集。 现在有了2操作,那么就需要
阅读全文
摘要:## 1.图的存储与遍历 ```cpp //链式前向星存储 int cnt,h[maxn]; struct edge{int to,nxt,val;}e[maxm]; void addedge(int u,int v,int val) { e[++cnt]=(edge){v,h[u],val}; h
阅读全文
摘要:字符串算法都好抽象啊…… 1. 字符串哈希 int hash(string s) { int ans=0,l=s.length(); for(int i=0;i<l;i++)ans=(ans*base%mod+(s[i]-'0'+1))%mod; return ans; } 2. 前缀函数 void
阅读全文
摘要:感觉自己对这种数据结构理解的一直不是很好…… 于是就有了这一篇。相信所有人都能看懂( 符号约定: 对于队列,使用[表示队首,使用]表示队尾。 对于栈,使用<表示栈顶,使用]表示栈底。 1. 单调队列 1.1 什么是单调队列 顾名思义,“单调队列”就是队列内元素满足单调性的队列。 比如下面这三个队列:
阅读全文
摘要:不包括字符串和图论内容。 代码压行警告qwq 如果存在与数据结构有关的经典算法,也会予以列出。 1. 单调队列 luoguP1886 单调队列和单调栈的讲解在这里 const int maxn=1000010; int n,k,cnt,a[maxn],minans[maxn],maxa
阅读全文
摘要:-1. 本文章中所有函数原型均为C++98的标准。 没有 bitset。 通用的操作 //遍历容器——以vector,map为例 vector<int> vt; map<int,int> mp; for(vector<int>::iterator it=vt.begin();it!=vt.end()
阅读全文
