随笔分类 - 数据结构
摘要:拓扑排序用于解决有向无环图的一些相关问题。 priority_queue<pair<int, int>,vector<pair<int,int>>,greater<pair<int, int>>> deg_idx; for (int i = 1; i <= n; i++) { deg_idx.pus
阅读全文
摘要:并查集初始化为p[i]=i 每次合并时,向右合并 区间大小为sz[find(i)]-1 例题: 2334. 元素值大于变化阈值的子数组 https://leetcode.cn/problems/subarray-with-elements-greater-than-varying-threshold
阅读全文
摘要:操作: pushup:由子节点算父节点信息 build:建立线段树,将一段区间初始化为线段树 modify:修改,修改某个点,或修改某个区间(需要使用pushdown) query:查询,查询某一段区间的信息 pushdown:父节点修改传递到子节点修改(懒标记) 原理: 满二叉树: 节点编号: 一
阅读全文
摘要:pair_hash struct PairHash { size_t operator()(const pair<int,int>& p) const { return hash<int>{}(p.first)^ hash<int>{}(p.second); } }; View Code vecto
阅读全文
摘要:解决的问题: 1、快速求前缀和(logn)(区间求和) 2、修改某一个数(logn)(单点修改) 对比:数组:求前缀和On,修改O1;前缀和数组:求前缀和O1,修改On C[x]表示,以x结尾,长度为lowbit(x)的区间中的计数 查询: 修改: 模板: int a[200010]; LL tr[
阅读全文
摘要:连通分量可以用并查集处理。 连通分量是环的条件可以是:边数等于点数,每个点的度都为2。 例题:AcWing 4493. 环形连通分量 #include<bits/stdc++.h> using namespace std; typedef long long LL; int p[200010]; i
阅读全文
摘要:并查集基本操作: 1、合并两个集合 2、查询集合的代表元素(祖先节点) 优化方式: 1、路径压缩(合并查询复杂度都是logn) 2、按秩合并(每次合并将深度较小的合并到深度较大的,logn) 3、1+2可以达到O(α(n))≈O(1),α():反Ackermann函数 扩展: 1、记录集合大小 2、
阅读全文
摘要:double和long long都是8字节,但是由于double使用科学计数法表示,所以数据范围比long long要大很多, 可以用来解决long long数据越界的问题(但是科学计数法精度会降低), long double 16/12字节,可以表示的范围更大。
阅读全文
摘要:可能会存在long long类型相乘超出long long表示的范围 可以考虑将long long转为double计算 因为浮点数是使用科学计数法表示的,double可表示的范围比long long大得多(但是会损失精度)
阅读全文
摘要:对于曼哈顿距离存在另一种形式的计算: 等式右边两项分别对应于:x1和x2、y1和y2的大小关系相同和不同的情况。 这样做的好处是,对于多个(x2,y2)点,可以预处理出全部点的最大和最小的x2+y2、x2-y2,这样对于任意其他点,可以在O(1)计算出它和全部点的曼哈顿距离的最大值。 例题: htt
阅读全文
摘要:如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。 假设鞍点是列极大行极小, 则,与鞍点同行或同列的点显然不是鞍点, 与鞍点不同行列的点z,可以对应,鞍点行列中的两个点x和y 且显然x<y(因为x<鞍点<y) 如果z<x,则z不为列极大,如果z>y,则z不为行极小, 如果x<z<y,则z不为列
阅读全文
摘要:对于大数,可以使用string存储。 如果要构造最大的大数,注意数的大小首先比较数的长度,然后从首位往后面的位比较。 例题: https://atcoder.jp/contests/abc257/tasks/abc257_e 首先可以计算出,可以构造出的最长位数 然后再从大到小对每一位,贪心的判断是
阅读全文
摘要:单调栈可以获得比第一个比当前数大/小的数的位置。 使用deque也可以用来二分查找。 如下例题: https://codeforces.com/contest/1696/problem/D 可以存储当前数的单调增栈和单调减栈,然后根据栈中首元素的相对位置,进行选择和二分查找。 #include<bi
阅读全文
摘要:区间dp常用的实现方式有:迭代式和记忆化搜索式。 迭代式可以枚举左右端点,也可以考虑先枚举区间长度,这样小区间就会在大区间之前被计算。大区间通过分界点由小区间转移。 例题 AcWing 282. 石子合并 此题直接枚举区间长度和左端点,右端点不超过n。 AcWing 1068. 环形石子合并 此题可
阅读全文
摘要:对于一个首尾相接的数组,设其旋转k1、k2、k3...次后可以恢复原状。 且k1<k2<k3<...。 则可以肯定,k1为这个数组的循环节,且k2、k3...均为k1的倍数。 一种求循环节的方法为: 对长度为n的循环字符串,先从小到大遍历可能的循环节的长度i,判断是否n%i==0,然后对其中的除第一
阅读全文
摘要:对一个字符串的子字符串,判断回文一般需要O(n)的时间, 但是如果预先处理出子字符串的哈希值,则可以在O(1)的时间判断。 具体方法是,如果是小写字母,则可以用26进制数进行记录。 base=26; for(...) ha[i]=ha[i-1]*base+(str[i]-'a'); 再反着进行一次哈
阅读全文
摘要:如果题目中数据较大,则尽可能将全部int替换为long long。因为很多地方都可能出现int*int爆int的情况
阅读全文
摘要:理论上unordered_map的存取速度很快。 但是在数据量很大的时候,哈希冲突过多会导致速度变慢。 此时可以使用map替代。(存疑) 同时,虽然unordered_map理论的插入是O(1),但是实际一秒只能运行1e5次左右,远低于1e8-1e9的数量级。 https://codeforces.
阅读全文
摘要:方法1:使用round()函数 方法2:(long long)(num/2.+0.5); 如果不加0.5,则会舍去造成数据不准。
阅读全文
摘要:可以用0x3f3f3f3f表示int正无穷 0xc0c0c0c0表示int负无穷 二者都是1e9级别,且可利用memset初始化。 负无穷也可以选择-0x3f 对于double,用科学计数法存储,初始化 -1可以视为-NAN
阅读全文