数据结构
1. 树状数组
- 写起来很方便, 用的比较多, 比线段树更实用吧. 虽然原理到现在不太清楚...
- 往往没有裸树状数组的题目, 往往和其他算法相结合.
- 单次修改或查询: O(logn)
- 1. BZOJ-2716-天使玩偶angel-CDQ分治 cdq分治
- 2. BZOJ-1878-HH的项链-SDOI2009 离线处理, 求种数
- 3. BZOJ-3289-Mato的文件管理-莫队+树状数组 莫队, 用树状数组统计逆序对
- 4. CODEVS-1082-线段树练习3-splay 比较新的思路
- 树状数组的弱点是不支持区间最大最小值什么的, 但是利用它可以统计前缀和的性质可以进行离线处理或统计某一时刻的数据. 还有可以通过转化的方式使它支持相减. 比如不根据位置而根据权值统计、维护权值出现次数等等.
2. 线段树
- 线段树操作比较齐全, 区间或单点修改、求和、求最大最小值, 支持一些标记比如增加、乘法等. 但是除非数据特殊不支持区间翻转.
- 因为统计功能比较强大, 所以有很多变种. 比如和树链剖分结合, 以及zkw线段树、函数式线段树(主席树).
- 有时需要动态开点
- 单次修改或查询: O(logn)
- 1. CODEVS-2018-反病毒软件-线段树 求第二大
- 2. BZOJ-3110-K大数查询-ZJOI2013-整体二分 打标记删除整棵树
- 3. COGS-930-找第k小的数-HNOI2012-主席树 函数式线段树
- 4. BZOJ-2588-Count-on-a-tree-SPOJ10628-LCA+主席树 函数式线段树
- 5. BZOJ-3531-旅行 动态开点线段树, 和链剖结合. 建立多棵线段树
- 6. BZOJ-1036-树的统计Count 链剖
- 7. CODEVS-1082-线段树练习3-splay 经典应用
3. splay
- splay支持的操作是这几项里最全的, 除了上面的还有区间插入、移动等.
- 可以自底向上, 可以自顶向下, 效率前者高一些, 但有的题目不能做.
- 上面各种数据结构的题其实都可以用splay做, 不过splay常数略大吧.
- splay的巅峰之作就是维护数列了吧. 标记下传真的太头疼了.
- 单次修改或查询: O(logn). 常数比较大.
- 1. [codevs 1343] 蚱蜢(省队选拔赛湖南) 自顶向下. 维护区间最大值, 支持单点移动.
- 2. [codevs 1514] 书架 只能采用自底向上的splay. 因为不是已知位置而是已知编号.
- 3. [codevs 1743] 反转卡片 区间翻转
- 4. CODEVS-1758-维护数列-NOI2005-splay 各种操作, 标记下传和维护难度很大, 要求统计最大和子序列.
- 5. CODEVS-3303-翻转区间 同上
- 6. CH-Round-#63-OrzCC杯#2省选热身赛 平衡树优化动态规划
- 7. CODEVS-1082-线段树练习3-splay 常数大的缺点暴露了
4. 并查集
- 性价比很高的算法. 支持集合合并和查找, 以及求秩
- 单次合并或查找: O(1)
- 1. [BZOJ 1012] 最大数maxnumber 更方便地维护单调栈
- 2. BZOJ-2001-city城市建设-HNOI2010-CDQ分治 cdq分治, 多次求解最小生成树.
- 3. CODEVS-1074-食物链-并查集 权值并查集, 比较好的题目.
5. 哈希表
- 主要用于判重, 做的题少(平常都用STL的set或者map了)
- 单次查找: O(1)
- 1. BZOJ-2761-不重复数字 裸hash, 模的数并不是越大越好(还要清零)
总结一下就是序列操作类的题目还可以做, 但遇到其他的比如字符串就只能STL暴力了.