知识点
—— 图论 ——
最短路 / 最小生成树
- Part Ⅰ 图论建模
化点权为边权
P1938 [USACO09NOV] Job Hunt S
P3393 逃离僵尸岛(注意 bfs 时要考虑防止对之后点的阻断)
拆点、拓维(——分层图)
P1948 [USACO08JAN] Telephone Lines S
P2939 [USACO09FEB] Revamping Trails G
P4822 [BJWC2012] 冻结
P4568 [JLOI2011] 飞行路线
P4009 汽车加油行驶问题(有一个贪心点(也不重要,不过一开始我没想到),注意一个油库重复经过一定比只经过一次劣)
P1073 [NOIP2009 提高组] 最优贸易
P1266 速度限制(多开速度一维)
CF1486E Paired Payment(这题直接建分层图有点极限,空间刚好卡过去了,也可以用多维数组做,先 mark 一下 link)
CF1473E Minimum Path(dp思想转化一下,就是一道很典的多维最短路)
UVA11367 Full Tank?(拆点,且必须拓维,若建图会超时,注意 dijstra 的本质,进行时效的优化(其实这题也很极限))
P9751 [CSP-J 2023] 旅游巴士
P4011 孤岛营救问题[CTSC1999](直观上会对当前钥匙状态拆点,但是看 y总写得贼长代码,其实实质就是 状态压缩(不同种类的钥匙 1~10,不可能开十位记录,可以用二进制数位记录,压缩为一维,nice) + bfs,很考思维,要么就考码力啦)
虚点 /虚边建图
CF1775D Friendly Spiders(建公因数虚点,原图边权为 1,可以直接跑 bfs 记录深度求最短路径)
CF1941G Rudolf and Subway
P7646 [COCI2012-2013#5] HIPERCIJEVI
[ARC061E] すぬけ君の地下鉄旅行(注意同一家地铁线路不一定联通,且求的是花销(做过的地铁线再遇到仍需花钱上车),考虑标记不同联通块建虚点,我用的并查集,(调了两天...))
CF1245D Shichikuji and Power Grid(最小生成树 + 虚点)
虚拟源点、反图
AcWing 1137. 选择最佳线路(两种思路都可以)
P1629 邮递员送信
- Part Ⅱ 最短路
P1462 通往奥格瑞玛的道路(+ 二分)
P5767 [NOI1997] 最优乘车
P1948 [USACO08JAN] Telephone Lines S(+ 二分)
P3008 [USACO11JAN] Roads and Planes G(很妙的一道题,正权连通块内跑 dij,连通快间属于含负边权的 DAG,直接跑拓扑排序,思路简单,但很锻炼码力)
——次短路 - k 短路
(次)P2865 [USACO06NOV] Roadblocks G(注意同时用到多个数组)
floyd 及其拓展应用
P1119 灾后重建(出题人良心,询问每次的 t 给出的大小顺序是不降的(一开始还没看出用意))
CF295B Greg and Graph
——传递闭包
B3611 【模板】传递闭包
P1347 排序
P2419 [USACO08JAN] Cow Contest S
P2881 [USACO07MAR] Ranking the Cows G(bitset 优化到
,w = 32(int))
——无向 /有向图最小环
P6175 无向图的最小环问题(floyd 好题,真的好题,要真的学懂 floyd 的本质)
AcWing 344. 观光之旅(记录最小环节点)
同余最短路
最短路计数
- Part Ⅲ 最小生成树
P2323 [HNOI2006] 公路修建问题(贪心思维)
P1967 [NOIP2013 提高组] 货车运输(生成树 + lca,可以用 lca 维护生成树上两点间的唯一路径)
P2502 [HAOI2006] 旅行(多次生成树判定,两整数求最大公约数技巧)
P3101 [USACO14JAN] Ski Course Rating G、P2658 汽车拉力比赛(二分 + 生成树)
P2798 爆弹虐场(二分 + 多边权生成树)
AcWing 346. 走廊泼水节(类最小生成树)
AcWing 1145. 北极通讯网络(一眼二分,注意不要把该写 double 的类型写成 int 了,这题我 kruskal 调用 mid 就手快写成了 int,调了半天...)
【练习】
P8207 [THUPC2022 初赛] 最小公倍树(kruskal 优化建图, lcm(x, y) * gcd(x, y) = x * y)
[ABC287Ex] Directed Graph and Query(floyd 对 dp 数组定义的本质,bitset 优化)
P2149 [SDOI2009] Elaxia的路线(这题解法之前还真没写过,求两点对的最长公共路径(可以顺交、逆交),用 dij 跑完最短路。。。哦,好吧,之前做过,但是这题是取交集。继续,之前,如果要求一个正权无环图中的最短路的最长路径,就是跑 dij 完得到最短路后对原图最短路经过的边建一个 dag(易证明),再在 dag 上跑个 topsort 记录最长路径。而这题同理,不过是在交集边上建 dag, 构造最短路图好题)
[ABC302F] Merge Set(虚点)
二分图
(不存在奇环、染色法不矛盾)
二分图判定:染色法
P1525 [NOIP2010 提高组] 关押罪犯(+ 二分)
最大匹配
P3386 【模板】二分图最大匹配(匈牙利算法,贪心 + dfs)
P1894 [USACO4.2] 完美的牛栏The Perfect Stall
P2071 座位安排(注意数空间范围)
P2055 [ZJOI2009] 假期的宿舍
AcWing 373. 車的放置(模型:Ⅰ.节点能分成两个独立的集合, 每个集合内没有边 Ⅱ.每个节点只能与一条匹配边相连)
AcWing 372. 棋盘覆盖(建立二分图模型思想)
P1129 [ZJOI2007] 矩阵游戏(矩阵的行列 可以是构建模型的方向,发现行之间或列之间变换显然不改变最大匹配数,且目标状态总有最大匹配数 = n 的性质)
P2065 [TJOI2011] 卡片(一眼 gcd + 最大匹配,有些超时不过可以拿到很可观的分数 70pts,要用质因数分解优化建图)
P6268 [SHOI2002] 舞会(染色标记建二分图)
P2526 [SHOI2001] 小狗散步
——不完全最大匹配(有约束条件)
P1640 [SCOI2010] 连续攻击游戏(因为一个装备的两个属性不能同时用,考虑可以对装备的属性向装备编号连边,满足二分图匹配要求;注意:此题要求属性值连续递增,若某点不合法,便直接 break,所以 O(nm) 的匈牙利实际上跑不满)
—— 多重分配
AcWing 374. 导弹防御塔(多重匹配:拆点法 + 实数二分,注意 eps 精度)
——最小点覆盖(= 最大匹配数)
UVA1194 Machine Schedule(模型:Ⅲ.每条边有两个端点,二者至少选一个)
AcWing 406. 放置机器人(O(n^2) 标记分隔连通块技巧)
P2825 [HEOI2016/TJOI2016] 游戏(崩了,有矩阵的时候多注意链式前向星的范围)
P6062 [USACO05JAN] Muddy Fields G
P1263 [CEOI2002] Royal guards(输出方案,通过 match[] 关联坐标与连通块编号)
——最大独立集(= 总点数 - 最小点覆盖)
P3033 [USACO11NOV] Cow Steeplechase G
最小路径点覆盖
P2172 [国家集训队] 部落战争
【网络流与线性规划 24 题】
P3355 骑士共存问题(最大独立集,向八个方向遍历的顺序会极大影响程序的时效......玄学)
P4304 [TJOI2013] 攻击装置
P5030 长脖子鹿放置(注意到走“目”字总有列的奇偶性相反或行的奇偶性相反)
P2756 飞行员配对方案问题(最大匹配)
P2763 试题库问题(多重匹配,对拆点的编号处理与遍历有些麻烦)
P2764 最小路径覆盖问题(最小路径点覆盖板子,注意输出方案时,应先保证右部(入点)无入度的点先递推,再对左部(入点)还未遍历的点递推,也就是先得到较长的覆盖路径,贪心保证得到较小路径数)
P2765 魔术球问题(最小路径点覆盖好题,需要反推和一些优化)
P4011 孤岛营救问题(额...一道基于拆点思想的状态压缩 + bfs 怎么会在网络流专题里 qwq,不对,是我太蒻了,想不到二分图的做法)
P4009 汽车加油行驶问题(真的,分层图板子)
tarjan
- 有向图连通性相关
强连通分量 scc
P2863 [USACO06JAN] The Cow Prom S /【模板】强连通分量
B3609 [图论与代数结构 701] 强连通分量(输出有点麻烦,我开的优先队列存总共
)
P1407 [国家集训队] 稳定婚姻(注意该题形成环必为偶环的特殊性质,从而想到建有向图思路)
——scc 缩点
P2812 校园网络(其实缩点也不需要真的建边,这题就可以直接算度数就行啦)
P2746 [USACO5.3] [IOI2001] 校园网Network of Schools
UVA12167 Proving Equivalences
一堆水题 ... 闭眼切
P2002 消息扩散
P2835 刻录光盘
P7251 [JSOI2014] 强连通图
P3387 【模板】缩点(缩点,用拓扑排序跑 DAG 最长路)
P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G(计算答案的策略有些坑(可能只是我太蠢了qwq))
P1262 间谍网络 (细节题,好多细节坑点)
P4819 [中山市选] 杀人游戏(注意在对答案有贡献的scc缩点后入度为0且节点数为1的scc,所连向的所有邻点都可以由其他点到达,那么这个点在查询完了其他点后,它的情况就确定了,但是这种特殊情况只能少查询最多1个节点,这是显然的,若有多个点满足条件,也无法确定情况,只有查询到最后剩一个节点才能确定。还有,需要缩点后计算入度的题目,总是考虑是否要去重边!!)
P9431 [NAPC-#1] Stage3 - Jump Refreshers(小清新题,转化一步就是典了,但是这题莫名卡数据范围还是什么,边数开到 1e7 才过??)
P2272 [ZJOI2007] 最大半连通子图
P2921 [USACO08DEC] Trick or Treat on the Farm G(缩点,环内、环外分类讨论即可)
有向图的必经点、边
2_sat
- 无向图连通性相关
割点 -> 点双连通分量 v-DCC
P3388 【模板】割点(割顶)
P8435 【模板】点双连通分量(注意判断自环)
P3469 [POI2008] BLO-Blockade(割点,统计size,分类讨论贡献)
P3225 [HNOI2012] 矿场搭建(这题我的代码吸氧会挂,直接全 wa,不吸氧却能ac,很玄学的东西,听别人说是 UB(undefined behavior))
(到底是谁套谁的题 ...)
SP16185 Mining your own business
UVA1108 Mining Your Own Business
割边/桥 -> 边双连通分量 e-DCC
P1656 炸铁路 /【模板】割边(桥)
P8436 【模板】边双连通分量(链式前向星存双向边的异或关系)
——v-DCC 缩点
——e-DCC 缩点
——无向图的必经点、边 -> 圆方树
P3854 [TJOI2008] 通讯网破坏(构造圆方树,将判断图上路径的必经点转化为树上的是否为简单路径上的点,用 lca 维护)
P4320 道路相遇(码农题,,,)
P5058 [ZJOI2004] 嗅探器(注意,记录路径上编号最小的割点不能把记录变量放到全局定义,这样会导致记录到 dfs 经过的所有合法割点中的最小值,路径上的必须定义在函数中,边走边实时记录)
P4606 [SDOI2018] 战略游戏(由两点拓展到 k 个点,即在线刻画一个包含给定点集的圆方树上最小连通块,求里面除了点集外的其余圆点,考虑根据 dfn 序从小到大两两枚举点对之间的简单路径统计贡献,发现这样做刚好得到两倍的所求连通图上信息,注意细节处理,好题)
——欧拉路问题
【练习】
P8287 「DAOI R1」Flame(bfs + 二分 + tarjan 判环(当然什么方法判环都可以),注意这里用 tarjan 如果只是简单判环,可以剪枝,不剪枝还会 T)
P2169 正则表达式(scc缩点后 dag 上跑最短路,板子)
P2783 有机化学之神偶尔会做作弊(以前一直想做这道题,终于切掉了也是,就是边双缩点 + lca,细节比较多,注意:求边双的时候,记得注意要不要去重边!)
P2194 HXY烧情侣(scc缩点,乘法原理)
P2860 [USACO06JAN] Redundant Paths G(注意,这题如果只是从统计边双大小为 1 的点角度做,是假的,可以举反例,比如两个大小为 2 的边双之间,只有一条边相连,此时还必须加一条边才行。所以必须边双缩点后做,此时显然就是统计叶节点)
P4742 [Wind Festival] Running In The Sky(细节板子)
P4306 [JSOI2010] 连通数(用拓扑跑经过的点数是假的,可以构造出重复统计同一个点的反例,所以,这题可以用 bitset
进行或运算规避,每次操作时间复杂度是
拓扑排序
P1137 旅行计划
P3074 [USACO13FEB] Milk Scheduling S(求一个最长路,有一点 dp 思想在里边?可能只是简单的递推结构)
P10480 可达性统计(从集合的角度思考,用 bitset 压位,妙妙题)
P4645 [COCI2006-2007#3] BICIKLI
P1038 [NOIP2003 提高组] 神经网络(喜欢做这种模拟具体模型的题目 qwq)
P1983 [NOIP2013 普及组] 车站分级(虚拟中继点(使 n^2 建图直接弱化到 2n,nb),拓扑排序,在拓扑序里跑最长路)
P4376 [USACO18OPEN] Milking Order G(二分 + 拓扑排序)
树论
树基础
树的重心
U104609 【模板】树的重心
树的直径
B4016 树的直径
P3629 [APIO2010] 巡逻(思维好题,结论很好贪心得到,两种求直径的方法都用到了)
P4408 [NOI2003] 逃学的小孩(+ 树上前缀和求两点间路径,水题haha)
CF455C Civilization(+ 并查集,动态合并维护直径,注意中点特殊性质,求边权为 1 的树的半径)
[AGC001C] Shorten Diameter(中点)
P3761 [TJOI2017] 城市(可以 O(n^2) 暴力枚举求树的半径,但边权不为 1,有点麻烦)
P5536 【XR-3】核心城市
CF734E Anton and Tree(缩点思想(但不需要真的缩点,然后一眼结论秒了)
P2491 [SDOI2011] 消防(转化很妙,双指针动态维护约束 s,然后分直径上和外挂在直径上的点分讨)
P1099 [NOIP2007 提高组] 树网的核(md,这题描述简直是令人作呕。。)
P2610 [ZJOI2012] 旅游(妙妙题,把三角形看作点)
——直径的必经点、边问题
P3304 [SDOI2013] 直径(求直径的必经边)
最近公共祖先 LCA
——倍增 LCA
P3379 【模板】最近公共祖先(LCA)
又是水题耶
P8855 [POI2002] 商务旅行
P5836 [USACO19DEC] Milk Visits S(稍微拓展了一下)
CF519E A and B and Lecture Rooms(lca + 分类讨论(找到两点路径上的中点技巧))
P6374 「StOI-1」树上询问(这题也涉及很多树上的基础操作)
CF33D Knights(思维好题,将圆转化为树上的点跑 lca,同时也有类似建立虚点的技巧(虚根),代码实现也很考验码力,好好好题)
CF1981C Turtle and an Incomplete Sequence
CF609E Minimum spanning tree for each edge(一道很典的题目,一道用 lca 维护路径上边权最大值的题目套了一个最小生成树,用 lca 维护路径信息,很经典)
——Tarjan LCA
——树链剖分 LCA
——LCA + 树上前缀和
P8805 [蓝桥杯 2022 国 B] 机房
P4427 [BJOI2018] 求和(注意 mod 和 longlong)
CF1304E 1-Trees and Queries(树上简单路径具有奇偶性,妙不可言呐这题)
P3398 仓鼠找 sugar(树上两条路径是否相交 trick:若两点的 lca 在另两点的路径上,则一定相交,否则,一定不相交)
——LCA + 树上差分
P4281 [AHOI2008] 紧急集合 / 聚会(要学会从题目中或手摸几个样例找特殊性质)
P3128 [USACO15DEC] Max Flow P
P3258 [JLOI2014] 松鼠的新家(注意路径重复走过
CF191C Fools and Roads
AcWing 352. 闇の連鎖(需要一些转化)
P2680 [NOIP2015 提高组] 运输计划( + 二分、贪心,好题)
P6869 [COCI2019-2020#5] Putovanje(haha,很简单的转化)
基环树
P8655 [蓝桥杯 2017 国 B] 发现环(理解概念,可以用扫描一遍拓扑序找环(无向))
P6037 Ryoku 的探索(简单分环上和子树上讨论)
——基环树直径
AcWing 289. 环路运输(本质,求基环树直径中对环上的操作其实就是做一个环形 dp,这里用到单调队列优化)
树链剖分
P3384 【模板】重链剖分/树链剖分(接近200行的代码。。。我居然一遍就调过去了,没开longlong)
P7746 [COCI2011-2012#3] PLAĆE(树剖 + 区修、点查,注意,不包括该点的子树编号范围是 [id[x] + 1, id[x] + siz[x] - 1])
P3038 [USACO11DEC] Grass Planting G(点权转边权,边上的树剖板子)
P4315 月下“毛景树”(不想调了,劳了)
P2146 [NOI2015] 软件包管理器(2015......那也几乎是10年前了,水蓝啦)
P2590 [ZJOI2008] 树的统计
P3833 [SHOI2012] 魔法树(第一道敲一遍就过的板子 qwq,我这效率。。。)
P3178 [HAOI2015] 树上操作
AT_past202010_m 筆塗り
GOT - Gao on a tree(set
暴力维护,
CF343D Water Tree
P6098 [USACO19FEB] Cow Land G
<--- 手动分割线 qwq --->
P4211 [LNOI2014] LCA(离线,运用前缀和思想,半年没调出来)
P4312 [COI2009] OTOCI(离线 + 并查集维护连通性,注意判环)
P9432 [NAPC-#1] rStage5 - Hard Conveyors(dijkstra + 板子,削(xue)微要一些转化吧)
P1505 [国家集训队] 旅游(是的,毒瘤题)
P2542 [AHOI2005] 航线规划(这题涉及的思想很重要,维护连通性可以用并查集,虽然加边好维护,但删边是不好维护的,所以这题离线下来,反向操作,再将关键边转化成边权)
——长链剖分
P10641 BZOJ3252 攻略
【貌似有个 qtree 系列题】
P4114 Qtree1(map
大法好!)
P4116 Qtree3(深度不能与点编号一一对应,但是 id[] 序 可以,然后就是板子了)
P4092 [HEOI2016/TJOI2016] 树(注意映射关系的含义,老是会搞错,以后调试的时候多加留心这部分)
【练习】
P7167 [eJOI2020 Day1] Fountain(倍增,单调栈预处理,图论建模,小综合,好题)
P1351 [NOIP2014 提高组] 联合权值(分祖孙和兄弟讨论)
P8972 『GROI-R1』 一切都已过去(注意到两数乘积要进位,且为整数位,只能是 2 * 5,还有,为什么又要开 longlong...)
负环
P2850 [USACO06DEC] Wormholes G
P2136 拉近距离(我是源点,你是终点。我们之间有负权环。 ——小明(nm,这句话误导我 qwq))
P2868 [USACO07DEC] Sightseeing Cows G(01分数规划,变形式子后直接上就是求是否存在正环,这里,跑最长路判正环 与 跑最短路判负环 是对称的,前者如果存在环会跑到正无穷,而后者会跑到负无穷。还有就是图不一定联通,所以 spfa 初始化要把所有点入队,这里可以用对所有点建立虚拟源点(使图联通且不会产生新环)理解,这是等价的)
[ARC173D] Bracket Walk(一点点转化,注意:在无向图中讨论连通性,在有向图中讨论强连通性,即若图中两点能互相到达,在无向图中称连通图,在有向图中称强连通图)
差分约束
P5960 【模板】差分约束(将不等式转化为边)
P3275 [SCOI2011] 糖果(tmd,加上信仰优化和 stack 优化还卡了我的 spfa 两个点玄学 wa)
P1250 种树
真 五倍经验 qwq,
空虚地刷经验
P1645 序列
P1986 元旦晚会
SP116 INTERVAL - Intervals
UVA1723 Intervals
[ABC216G] 01Sequence(这题显然卡 spfa,不用 spfa,那只能用 dij 跑了,所以这里的对于区间 [l,r] 至少有 x 个 1 可以反向为至多有 r - l + 1 - x 个 0,变成求最大值的问题,就能跑最短路了,且边权为正)
P2474 [SCOI2008] 天平(差分约束 + floyd,一点贪心)
网络流
—— 数据结构 Date Structure ——
基础数据结构
栈
——单调栈
P5788 【模板】单调栈(跟单调队列的区别在于,因为栈是后进先出,不能从栈底出栈,所以栈底是静态的,不会受到下标的影响,注意:s[top] 是当前的最优决策)
P2947 [USACO09MAR] Look Up S
P2866 [USACO06NOV] Bad Hair Day S
P9210 蓬莱「凯风快晴 −富士火山−」(维护树上信息跑单调栈)
堆(二叉堆,优先队列)
其实很多题目都是贪心
P3378 【模板】堆
P3045 [USACO12FEB] Cow Coupons G(反悔贪心,维护三类值的小根堆)
Supermarket
P1631 序列合并(因为单调不降,可以列出n行不等式链,贪心,初始把最小列都进堆,维护一个小根堆,查找 k 次,对于每次查找的堆顶
K Smallest Sums(k 维拓展版,但是数据弱了,直接套个循环
水过去嘿嘿)
P8769 [蓝桥杯 2021 国 C] 巧克力(逆序遍历,防止出现有一些价格较贵但保质期较短的物品落选,导致最后几天没有物品可选的情况)
P4053 [JSOI2007] 建筑抢修(幽默蓝题,首先一定是按照 t2 从小到大修,如果当前能修则修,不能修,贪心地将当前 t1 最大的报废掉是最优的)
——对顶堆
一个查询第 k 大/小 的数 的 trick,很好写,也很快,
接近线性,就是用两个堆(大、小根堆)维护序列的单调性
P1168 中位数
P1801 黑匣子(此题 k 是动态的,对顶堆动态维护同样方便)
st表
tip:注意到 st表在 O(1) 查询时,是将区间进行分割,一分为二,用两段
长度的区间取最优解,其中会有 重叠区间,因为 所以,st表一般用于求解 满足结合律的 可重复贡献问题,例如最大值 max(a, b, c) = max(max(a, b), max(b, c)),但是区间和则不能维护,a + b + c ≠ (a + b) + (b + c)
每次调用 log2() 并不值得,可以预处理个数组出来, lg[i] = lg[i / 2] + 1, i
[1, n], lg[0] = -1(使得 lg[1] = 0)
P3865 【模板】ST 表 && RMQ 问题
P9704 「TFOI R1」Tree Home(化简式子,分类讨论,维护四个st表(这里我运用了构造函数的思想,寻找相似的部分,实际上就简化到只要开两个数组就好了,不过是三维 qwq),码量比较大,练手好题)
P9027 [CCC2021 S5] Math Homework
P8818 [CSP-S 2022] 策略游戏(qn^2 -> n^3 暴力 20 分,nmlogm + qn -> n^2 每行维护一个 st 表有 60 分,线性做法要分类讨论,维护六个 st 表)
P4085 [USACO17DEC] Haybale Feast G(双指针 + st表)
发现 st表不支持修改操作 。。。所以 。。。
进阶数据结构
树状数组
P3374 【模板】树状数组 1(点修 + 区查)
P3368 【模板】树状数组 2(区修 + 点查, 差分)
P3372 【模板】线段树 1(区修 + 区查,码量是线段树的一半,但是要变形一下求和式,维护两个树状数组)
P10589 楼兰图腾(乘法原理)
P1908 逆序对(+ 离散化,这题也是按值建树状数组,感觉是个会很常见的套路)
线段树(Wow(^-^)V
P3372 【模板】线段树 1(pushdown 懒标记 实现区间加)
P2846 [USACO08NOV] Light Switching G
P3870 [TJOI2009] 开关
P2574 XOR的艺术
P3373 【模板】线段树 2(懒标记优先级)
P1253 扶苏的问题(简单实现多个懒标记维护,区间修改 和 区间加)
P10463 Interval GCD(区修 + 区间查询 gcd,发现形如 “对 [l, r] 区间都加上 k” 这样的修改操作,一般可以往差分方向转化,同时,这题用到一个数学定理:
P4392 [BOI2007] Sound 静音问题(简单的区间 max/min,st 表也可做)
P3801 红色的幻想乡(维护多颗线段树,简单容斥, 使用指针数组传参减小码量)
P1558 色板游戏(状态压缩,很典)
P8856 [POI2002] 火车线路(简单转化,注意一次购票的终点站不算占座,且不能满足的需求不要更新啊喂)
P4588 [TJOI2018] 数学计算(第一眼看好久都没头绪,还有,这题说明 除法不能直接取模,但是这题如果从时间角度来看,就是两种单点修改而已,操作一就是在表示当前时间点的节点变为 m,操作二虽然是除 pos 时间的 m,其实就等价于将 pos 时间节点的值重置为 1,维护区间乘,按时间戳建线段树,好题)
P1471 方差(维护区间方差,简单式子变形,注意维护区间
P2122 还教室(按分式输出)
P5142 区间方差(tnnd,还要对分式取模,逆元)
[ABC352D] Permutation Subsequence(通过映射转化满足约束,然后套线段树板子,这题的转化有点小妙)
P11217 【MX-S4-T1】「yyOI R2」youyou 的垃圾桶(线段树上二分)
P1438 无聊的数列(差分板子,确实没味)
——扫描线
P5490 【模板】扫描线 & 矩形面积并
IMBOX - Destroying the Weapon Warehouse
(永远无法逾越的大山。。。)
P7764 [COCI2016-2017#5] Poklon(离线,扫描线思想,很形象,可能这就是广义的扫描线 —— 离散小波变换°)
P1972 [SDOI2009] HH的项链(同类型,不过约束是统计不同类型,以及下面两道到水蓝,嘿嘿)
DQUERY - D-query
[ABC174F] Range Set Query
P4113 [HEOI2012] 采花(仍是变式,但是这题卡得有点紧啊,换上树状数组、快读,把 map 改成数组,常数才够卡过去)
——动态开点
CF915E Physical Education Lessons
——线段树优化 dp -> 动态规划 - 数据结构优化 dp
【spoj GSS 经典组题】
GSS1 - Can you answer these queries I(维护最大子段和,不喜欢写结构体式线段树 。。。)
GSS3 - Can you answer these queries III(+ 点修)
P4513 小白逛公园
P6492 [COCI2010-2011#6] STEP(套路类似,通过维护区间前缀和/后缀和来进行区间信息合并操作)
[ABC341E] Alternating String(上一题的去修 + 区查版本,代码打吐了要 🤮)
GSS4 - Can you answer these queries IV(势能线段树板子,就是加上剪枝?注意到
ds 优化建图(线段树)
CF786B Legacy(这题边数难以估计,最好用 vector
)
P6348 [PA2011] Journeys(在出树和入树之间等价地建一个虚点,另外,能用 01-bfs 就用)
分块
#6280. 数列分块入门 4(从最熟悉的区间偏移 + 区间求和开始)
#6277. 数列分块入门 1(改成点查)
#6278. 数列分块入门 2(维护区间 < x 的个数,在块上修改时 re_sort,查询时二分,时间复杂度可以做到 vector
的 .begin() .end()
之类的指针,注意它是 0-index 的)
P2801 教主的魔法
UVA12003 Array Transformer
SP18185 GIVEAWAY - Give Away
#6279. 数列分块入门 3(稍微改改即可(懒得用 set
了 qwq)
#6281. 数列分块入门 5(开方操作,类似势能分析剪枝,可以发现一个数 n <= 50000,至多开方下取整 4 次后变成 1 或 0,而 1 或 0 再开方就没必要了,跳过即可,所以完全可以暴力做中间的整块,时间复杂度是
#6282. 数列分块入门 6(动态分块,对于非随机数据插点,要保证每次修改操作为
#6283. 数列分块入门 7(区间加和区间乘)
#6284. 数列分块入门 8(区间查询给定值个数)
[ABC339G] Smaller Sum(3.5s 注意卡常,分块卡常主要是调整块数和块长之间的大小)
【练习】
P2048 [NOI2010] 超级钢琴(rmq 结合 优先队列 好题,细节处理较多)
P9565 [SDCPC2023] Not Another Path Query Problem(位运算分log层,并查集维护连通性)
P10350 [PA2024] Modernizacja Bajtocji(简单并查集应用,但是建模思维好题!)
CF280B Maximum Xor Secondary(单调栈)
[ABC352D] Permutation Subsequence(映射,转化为求区间max,min,滑动窗口,st表,线段树 都可以做)
CF242E XOR on Segment(线段树维护位运算操作,trick:拆位)
CF438D The Child and Sequence(势能分析线段树,mod 结论剪枝优化:
并查集 - 带权、扩展域并查集
字典树
笛卡尔树
平衡树(AVL、Splay、Treap、替罪羊树)- 后缀平衡树
- NOI级
可并堆
分块
可持久化
树套树
块状链表
主席树
舞蹈链(DLX)
KDtree
启发式合并
珂朵莉树
—— 搜索 ——
CF1276B Two Fairs(很有意思,求互异于给定的两点 a, b 的点对 (u, v),要求 u - v 的所有路径必须经过给定两点,很像学 tarjan 时的割点,其实就把图抽象为以 a,b 为界的三部分 dfs 出 a 的左部, b 的右部然后乘法原理即可,还有,清空链式前向星其实只要把队头数组清零(和 top))
[ABC067D] Fennec VS. Snuke(简单博弈,显然转化为简单路径上观察即可)
[ABC251F] Two Spanning Trees(dfs、bfs本质理解)
P4668 [BalticOI 2011 Day1] Treasures and Vikings(跑地图经典题)
P7775 [COCI2009-2010#2] VUK(二分)
P7284 [COCI2020-2021#4] Patkice II(bfs,虽然我用的是 dij 跑的 eee,但这题练习图论建模还是不错,细节有一丢丢吧,好题)
P1034 [NOIP2002 提高组] 矩形覆盖(第一次写封装到 struct 里的函数,确实简洁许多)
剪枝、记忆化
启发式搜索(A*)
迭代加深搜索(IDA*)
双向广搜
随机化搜索
—— 动态规划 Dynamic Programming ——
线性 / 序列 dp
B3637 最长上升子序列(用贪心 + 二分可以 O(nlogn) 解决)
P1439 【模板】最长公共子序列
CF10D LCIS(发现决策集合重复扫描,决策集合元素只增不减,实时记录代替循环)
P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
(基础很重要 ...)
UVA437 巴比伦塔 The Tower of Babylon(可以用 DAG 建模的方式思考)
SP15637 GNYR04H - Mr Youngs Picture Permutations
P1006 [NOIP2008 提高组] 传纸条
(削弱版 qwq,因为我做传纸条的思路包括可以重复走,但是重复走只累加一次贡献。虽然是不能重复走,但是重复走累加一次贡献一定是小于不重复走累加两次,所以一定会被更优解更新掉,也就刚好符合方格取数 哈哈)
P1004 [NOIP2000 提高组] 方格取数
SP703 SERVICE - Mobile Service(动态规划转移相当于在 DAG 上走边,一般有两种方式:Ⅰ 用它所依赖的状态更新当前状态, Ⅱ 用当前状态更新依赖它的状态,分别对应当前点的入边、出边。这道题目用后者,因为对于当前位置 i 且另外两点在 x, y 的三元组 (i, x, y) ,它的入边可能有很多种情况,但出边永远只有三条:x -> i + 1,y -> i + 1,z(i) -> i + 1)
前缀和优化
P2513 [HAOI2009] 逆序对数列
[ABC179D] Leaping Tak(终于遇到一个简单的题目了)
[ABC222D] Between Two Arrays
[ABC183E] Queen on Grid(二维,分三个方向前缀和)
AT_dp_m Candies(一眼秒 ...... 不是,哥们,为什么你会是绿题 qwq)
UVA1650 / hdu4055 数字串 Number String(如果只是定义 f[i, j] 表示前 i 个数且末尾为 j 的合法序列的方案数,考察 i - 1 和 i,我们并不知道 1 ~ i- 2 位是否填过 j,但并不影响统计,因为题目 只约束了相对大小而没有要求绝对大小,所以即使对于某一方案已经填过 j 了,也可以等价地将先前所有 >= j 的数 + 1,这样做就变相保证前边没有 j,且不会改变相对大小。还有一个很重要的点: scanf("%s", c)
里边不能加 &
)
hdu6078 Wavel Sequence
背包问题
01 背包
P1048 【模板】[NOIP2005 普及组] 采药
P1282 多米诺骨牌
完全背包
P1616 【模板】疯狂的采药(朴素的(二维数组)完全背包是
tip:关于滚动数组的顺逆序问题,01背包设计 f[i, j] 时是由上一层转移而来,所以如果滚动后顺序遍历,就会提前 f[j] 而更新 f[j - v[i]],变成用同层的信息转移,错误;而完全背包由于是同层转移(都没讨论由上一层直接继承),所以用顺序遍历正确
01背包:
完全背包:
多重背包
(朴素做法是将多重背包中的物品转化为
——二进制优化 把
——单调队列优化
tip:这里讨论一下拆分系数的空间问题(似乎没看到过有人注意?
不过确实简单)首先知道拆分系数
对数基本恒等式,转化一下就是:
基本不等式:
以板子的数据为例,件数总和 1e5,件数 100,,所以这题二进制拆分数组开 1000 够够的
P1776 【模板】宝物筛选
P1782 旅行商的背包(不开 longlong 见祖宗 ...)
混合背包
P1833 【模板】樱花(这题空间老是开小了)
P2623 物品选取
P2851 [USACO06DEC] The Fewest Coins G(完全 + 多重,上界?数组开到最大直接冲)
分组背包
P1757 【模板】通天之分组背包
二维/多维费用背包
P1507 【模板】NASA的食物计划
有依赖的背包
——树形依赖背包 <- 树形dp
泛化物品
背包问题问法变化
区间 dp
CF607B Zuma(一个关于小时候玩过的 zuma 游戏的题,有意思)
P4170 [CQOI2007] 涂色(典?紫?)
P4290 [HAOI2008] 玩具取名(状态转移有点像传递闭包的感觉)
P4342 [IOI1998] Polygon(乘法操作,要考虑正负相乘,所以要同时维护最大值和最小值,分类讨论,虽然不重复有六种情况,但可以总结出底层的四种元素再分别暴力取max、min以减少码量,很可以,好题)
P5752 [NOI1999] 棋盘分割(用高一概率学过的知识转化一下就好做了,不过码量大调了好久,注意最后 int 算到 double 要 *1.0 保证精度,好题)
P1043 [NOIP2003 普及组] 数字游戏(用前缀和预处理)
树形 dp & 图上(图形?) dp
普通树形dp
P1352 没有上司的舞会(以前真的觉得这个题目是世纪难题 qwq,不过现在回过头来确是最基础的树形dp,可能这就是见证我成长的题目吧)
P4084 [USACO17DEC] Barn Painting G(一开始我居然对当前点和它的子节点是否已涂色作分类讨论,其实涂色的直接初始化其他涂色情况不存在即可)
P1131 [ZJOI2007] 时态同步
P2458 [SDOI2006] 保安站岗(不要惯性思维只考察 u -> v,有时可能父节点也会影响当前点状态转移 fa -> u -> v)
P3174 [HAOI2009] 毛毛虫(树形dp求直径变形)
P2015 二叉苹果树(对于严格的二叉树,可以考虑预处理出每个点的左右儿子进行转移)
二次扫描与换根法
P3478 [POI2008] STA-Station(注意:对于 u -> v,不是由子树向上转移,而是一开始知道根节点的值,即知道父节点的值向下转移)
P2986 [USACO10MAR] Great Cow Gathering G(好爽 qwq,换根法很具象(可能做板子是这样的),有点做图论题的感觉)
多倍经验 嘿嘿
[ABC220F] Distance Sums 2
[ABC348E] Minimize Sum of Distances
CF1092F Tree with Maximum Cost
P3047 [USACO12FEB] Nearby Cows G(容斥)
P10974 Accumulation Degree
P3647 [APIO2014] 连珠线
树形依赖背包
P2014 [CTSC1997] 选课(树上跑 01 背包)
基环树
dp 优化策略
状压 dp
tip:
不像序列DP、树形DP之类的直接 dp[i] 表示 i 这个前缀,或者 i 这个子树的相关信息。
状压DP要求表示的状态往往是一个集合的一个子集、一张图的一个子图,或者其他什么乱七八糟的东西,需要你手动 把这些状态和自然数之间建立起一个一一对应关系 方便写代码而已。
P1896 [SCOI2005] 互不侵犯(位运算,另外统计方案数的题目最好开 long long
保险一点)
P1879 [USACO06NOV] Corn Fields G
P2704 [NOI2001] 炮兵阵地(滚动数组i & 1
)
P5911 [POI2004] PRZ(枚举子集类的状压,这里用到枚举二进制数子集的技巧,for s0 = s; s0; s0 = (s0 - 1) & s
)
P3052 [USACO12MAR] Cows in a Skyscraper G(枚举子集很一眼,但是会 T 两个点,但是但是,吸个氧居然就过了 哈哈)
tip:枚举二进制码的子集的时间复杂度是
,证明
单调队列优化
tip:一些细节问题(哨兵 ......
P1886 滑动窗口 /【模板】单调队列(很经典的模型板子,三年后再一次做这道题 ......)
AcWing 135. 最大子序和
P2627 [USACO11OPEN] Mowing the Lawn G
P2216 [HAOI2007] 理想的正方形(二维单调队列优化,实际上就是做两遍)
AcWing 289. 环路运输
P5858 「SWTR-3」Golden Sword
P1725 琪露诺
P3572 [POI2014] PTA-Little Bird(单调队列维护的对象的比较规则中不一定只有一个元素)
——单调栈优化
CF1407D Discrete Centrifugal Jumps
倍增优化
CF1175E Minimal Segment Cover(注意同一个左端点可能有多个线段为起点,所以初始化记得取 max)
数据结构优化
P2893 [USACO08FEB] Making the Grade G(性质很显然,然后和 O(n^2) 求 LCS 一样。主要优化的点就是用一个变量实时记录决策最值(这个变量在这里就相当于“数据结构”的效果,本质))
(决策集合不断扩大,避免重复扫描,实时记录决策集合的最优解)
线段树 / 树状数组优化 dp
B3637 最长上升子序列(是真没想到。。。按值建线段树来容易实现朴素dp中 aj < ai 的约束,真的很常用欸,让我想起了逆序对)
The Battle of Chibi(优化后复杂度也达到了 O(n^2logn),所以。。。这题居然卡线段树(常数比较大),用树状数组维护)
P1668 [USACO04DEC] Cleaning Shifts S(用线段树的点修和区查,维护 dp 数组的决策更新和决策集合最小值,从循环花费的 O(n) 降到跑线段树 O(logn))
P2418 yyy loves OI IV(经典值域线段树优化)
[ARC159D] LIS 2(贪心结论,维护两个线段树)
斜率优化
数位 dp
插头 dp(轮廓线)
四边形不等式优化
矩乘优化
—— 字符串 ——
哈希hash
KMP
字典树trie
AC自动机
后缀数组
最小表示法
manacher
后缀树
后缀自动机
回文自动机
—— 数学 ——
模运算与同余
整数唯一分解定理
辗转相除法(欧几里得算法)
素数筛法:埃氏筛法与线性筛法
加法原理、乘法原理
排列组合
杨辉三角
- 初等数论
同余式
欧拉定理和欧拉函数
费马小定理
威尔逊定理
裴蜀定理
模运算意义下的逆元
扩展欧几里得算法
中国剩余定理
- 离散与组合数学
多重集合
等价类
多重集上的排列
多重集上的组合
错排列、圆排列
鸽巢原理
二项式定理
容斥原理
卡特兰(Catalan)数
- 线性代数
向量与矩阵的概念
向量的运算
矩阵的初等变换
矩阵的运算:加法、减法、乘法与转置
特殊矩阵的概念:单位阵、三角阵、
对称阵和稀疏矩阵
高斯消元法
—— 杂项 ——
0/1 分数规划
模拟退火
爬山算法
整体二分
莫队 - 树上莫队
CDQ分治
—— blog ——
其他
数据结构
树状数组 - 权值树状数组 - 树状数组的优化及扩展
线段树应用:扫描线 - 线段树 tricks - 线段树分裂 - 权值线段树
图论
一些别的东西
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具