I. 基本思想
前言
基本思想能帮助我们发现问题的一些一般性规律并加以分类,不至于让它们形成一盘散沙。
从一般性的规律中,我们能利用起自己的经验,或是发现更多的规律,进而形成一套有效的方法。
然而,光有基本思想几乎不能帮助我们解决问题。问题的特殊性才是解题中更需要关注的。
因此,下文基本是泛谈,具体的细节技巧还是要深入到更为细致的分类中去。
问题类型
OI中遇到的问题类型,大多可以归入如下几种:模拟、最优化、计数、构造。
每种问题有其特点和通常的解决手段。例如:
最优化题往往无需对每个解进行不重不漏的统计,而可以舍去一定不会成为最优解的解,或是重复统计某一种解。
计数题可以通过合适的变形、适当的枚举顺序以及技巧性的计算方法(如容斥)进行优化。
因此,对问题的适当分类,寻找、类比一类问题的常用解决方法是十分有效的。
枚举
枚举时,我们通常关心:枚举的顺序?枚举某一个量后是否能快速计算?是否具有独立性,从而可以分开枚举后组合?
枚举的技巧:通过问题的性质,减少枚举量;通过增加枚举量,优化问题的结构。
分治
我们可以借助常见的分治方法来探索分治的作用和技巧。
“猫树分治”:将需要统计的信息,转化成经过某一个中心的信息。
点分治:将相对复杂的结构,转化成简单的结构。
cdq分治:将一个维度的影响,转化成01的比较。
线段树分治:通过分治树的结构,正确处理“时间”,在叶子节点完成问题。
各有所长,但也有共性:对于一个庞大的问题,通过适当的分类(往往是分成两半),批量处理具有共同特点的一部分问题,然后递归解决子问题。
有根树形结构
合并、分裂(分治)、互不相交等等词汇,会构成一个有根树的模样。
在其节点上维护和储存信息,可以将静态的分治方法在线化。
一些看似不相关的东西可能因此变得有联系,例如:启发式合并,在合并树上无非是dsu on tree(链分治)。
二分、单调性的利用
具有单调性的问题可以大幅简化最优化过程中的决策。二分是利用单调性的一个常见方法,双指针也是。
除此之外,凸性也是一个常见的性质。借助几何直观,它们的利用方法会更加显然地浮现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】