• 数据结构方法总结


    数据结构方法总结

    上个世纪,Niklaus Wirth 提出:程序=算法+数据结构(初赛要考qaq)

    数据结构是一种处理数据的方法,很明显是必不可少的。

    oi中的数据结构,除去数组,栈,队列等sb数据结构,根据复杂度可大致分为 log 结构和 sqrt 结构(我自己胡的说法,很明显不严谨)。其中log以线段树,平衡树,树套树为代表,而sqrt以分块,莫队为代表。

    已有两篇blog:log sqrt

    而这里,我们讨论一个更高层的问题:如何综合的运用这些东西。

    转化

    很多问题是不能直接做的,都需要转化。转化问题这件事,往往是做题的第一步/前几步。

    转化有多种多样的,在数据结构题中,所做的转化需要围绕着 方便维护 来转化。

    • loj2873:“单峰序列” -> 从中间开始,递减的往两边加数,自然就会形成一个“峰”

    • loj2346:斜向操作 -> 水平竖直的操作(转坐标轴)

    • 区间中不同的数 -> 只统计pre<l的数

    • 区间中只出现一次 -> pre<l,suf>r

      注:pre,suf是解决 “本质不同” “出现次数” 等问题的有力工具

    我们联合

    很多题目是不能靠一个算法搞定的,通常需要几个算法配合解决。

    数据结构方面的算法,通常可以快速/块速的维护一些东西,以起到优化复杂度的作用。

    有的题目甚至可以直接在数据结构上做,我没见过

    比如,在线段树上跑树形dp,我纯口胡的,没见过

    • CF809D:注意到这个dp有 (f_i=f_{i-1}+...) 的形式,即区间平移后区间加,用平衡树的插入与lazytag来优化
    • CF573E:推出本题的贪心策略之后,用平衡树维护
    • 经典应用:SAM+线段树合并
    • CF833B:用上面的pre转化后,注意到 (f) 的转移相当于一个区间+区间max,线段树维护
    • 经典应用:线段树优化建图
    • 经典应用:树套树(这个相当于两种数据结构互相配合)

    常见应用

    • 区间取min:seg-beats
    • 区间平移/翻转:平衡树
    • 来来回回区间贡献:线段树+脑子
    • 部分非强制在线题:扫描线+线段树
    • 已知一个数,选一个数,max xor:trie
    • 不好做的区间信息:分块

    怎么只有这么点东西啊

    做题少,抱歉啊qaq

  • 相关阅读:
    Java8之Consumer接口
    Java8之Cloneable接口
    Java基础之Iterator接口
    Java基础之Iterable接口
    WPF中窗体在同一个位置实现不同页面切换
    WPF中单选框RadioButton
    WPF中的TextBlock处理长字符串
    WPF中Canvas使用
    WPF中窗体调用窗体
    WPF中HyperLink超链接的使用
  • 原文地址:https://www.cnblogs.com/LightningUZ/p/15254230.html
Copyright © 2020-2023  润新知