- CF1172E Nauuo and ODT
- SP16549 QTREE6 - Query on a tree VI
- P3177 [HAOI2015] 树上染色
- CF1172C2 Nauuo and Pictures (hard version)
- CF1172B Nauuo and Circle
- CF1172A Nauuo and Cards
- CF963D Frequency of String
- CF914F Substrings in a String
- AT4840 [ABC138F] Coincidence
- CF1245F Daniel and Spring Cleaning
- 牛客练习赛96 F
- 牛客练习赛96 C
- P5038 [SCOI2012]奇怪的游戏
- P5038 [SCOI2012]奇怪的游戏
- YBT C79P2 B. 卖猪问题
- P5934 [清华集训2012]最小生成树
- P4311 士兵占领
- P2045 方格取数加强版
- P7368 [USACO05NOV]Asteroids G
- CF809C Find a car
- CF266D BerDonalds
- CF1495D BFS Trees
- CF1514D Cut and Stick
- CF1580C Train Maintenance
- CF1580C Train Maintenance
- CF920E Connected Components?
- LG-P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
- Loj#6276 果树
- P3201 [HNOI2009] 梦幻布丁
- P5290 [十二省联考 2019] 春节十二响
- 牛客挑战赛57-C-树上行走
- P3302 [SDOI2013]森林
- P2387 [NOI2014] 魔法森林
- P4842 城市旅行
- P4332 [SHOI2014]三叉神经树
- bzoj2959 长跑
猫昕倾情推荐/tyt
不定时咕咕更新
CF1172E Nauuo and ODT
- Link-Cut-Tree
和 SP16549 做法差不多。需要额外维护平方的贡献,再开一个变量维护虚儿子的平方和即可。
SP16549 QTREE6 - Query on a tree VI
- Link-Cut-Tree
维护同种颜色的连通块并查询连通块大小,单点修改。菊花图会卡。所以把点的颜色放到与父亲所连的边上维护就可以了。需要维护一个实儿子的答案一个虚儿子的答案。
P3177 [HAOI2015] 树上染色
- 树形 DP
直接设一个两维 DP 直接转移贡献即可。
CF1172C2 Nauuo and Pictures (hard version)
- 概率期望 DP
设一个朴素的状态四维,发现一个神奇的结论压一维,然后再根据给定关系设一个更神奇的状态压成两维。
CF1172B Nauuo and Circle
- 转化思考方向
固定起点,考虑添加一条边时,一个端点的方案,然后进行扩展。
CF1172A Nauuo and Cards
- 发现性质,利用性质
发现答案只有两种得到的情况,直接模拟即可。 \(0\) 的个数有一半是可以去利用的。
CF963D Frequency of String
- bitset
用 bitset 模拟暴力,因为 \(\sum |m_i| \le 10^5\) ,所以复杂度为 \(\frac{|S| \sum |m_i|}{w}\) 是可行的。
CF914F Substrings in a String
- 字符串?不不不是 bitset
用 bitset 模拟暴力。区间的限制可以用前缀相减的方式来处理。
AT4840 [ABC138F] Coincidence
- 数位 DP
与上题类似。通过分析得到 \(y \bmod x = x \oplus y\) 如果其二进制第一位相同的情况下可以转化成 \(y - x = x \oplus y\)。设状态可以一个设是否顶下界,一个设是否顶上界。
CF1245F Daniel and Spring Cleaning
- 数位 DP
设状态的时候可以设成两个数当前位是否顶上界,而不是当前为填什么。
牛客练习赛96 F
- 发现性质
每个点的覆盖范围是一个区间,所以只需要在b数组中所有的这个元素都只出现在这个区间内且奇偶性与当前点相同。单调栈做到线性。
牛客练习赛96 C
- 发现性质 + RMQ
\[\sum_{l=1}^{n} \sum_{r=l}^{n} [\max_{l \le i \le r}\{a_i\} = \min_{l \le i \le r} \{ a_i \} + k] \]
固定左端点后,随着右端点右移最大值变大,最小值变小,差值是单增的。RMQ预处理+二分即可。
P5038 [SCOI2012]奇怪的游戏
- 最大流
危桥通行两次可看作往返一次。
其余正常建图,特殊的地方是需要交换第二组起点再跑一边,两边均满流才合法。(有可能出现 \(a_1\) 流 \(b_2\), \(b_1\) 流 \(a_2\) 的情况)
P5038 [SCOI2012]奇怪的游戏
- 最大流
一个网格每次操作相邻两个那就是二分图了。对于最终变成的那个数要二分。注意还需要讨论 \(n \times m\) 的奇偶性。
YBT C79P2 B. 卖猪问题
- 最大流,建模
如果后来的人和先来的人开的房间有重叠,可以让先来的人和后来的人连边,总而满足调配猪猪的限制。
P5934 [清华集训2012]最小生成树
- 最小割
给定一张图,有边权,额外给定一条边 \((u,v,w)\) ,删去图中任意条边,使额外给定的边可能在最小生成树和最大生成树上。求最少删几条。
转化思考方向,考虑在什么时候有可能会用上这条边。以最小生成树为例,把 \(< w\) 的边都加进去但 \(u,v\) 仍不连通。所以我们可以找到所有 \(<w\) 的边 \((x,y)\) ,在 \(x,y\) 之间互相连一条流量为 \(1\) 的边跑最小割。最大生成树时同理。
P4311 士兵占领
- 费用流
套路划分为二分图,把所有士兵看作边相连,流量为 \(1\) 花费为 \(1\),
对于每行的限制从源点连边,流量 \(L_i\) 花费 \(0\),列同理。
跑完最大流看看每行每列还差多少,直接补,补不了就无解。
P2045 方格取数加强版
- 费用流
次数的限制可以放在最大流上。价值的限制拆点转化到边上,并且可连两条甚至更多。可以用流量为 INF
花费为 \(0\) 的边维护联通性。
P7368 [USACO05NOV]Asteroids G
- 网络流,二分图匹配
一个网格,给定点,每次可以覆盖一行或一列,求覆盖所有点的最小次数。
把行和列分开看作点,把点 \((x,y)\) 看作连接行 \(x\) 和列 \(y\) 的边,然后转化成了最小点覆盖问题,跑最小割即可。
CF809C Find a car
- 观察/找规律题
打表找规律。有个神奇的结论 \(a_{i,j} = (i-1) \oplus (j-1) + 1\)。然后根据打的表发现可以按照二的倍数划分,于是就可以上二维树状数组了。计算过程的那个式子没看懂
CF266D BerDonalds
- 最小直径生成树(图的绝对中心)
图的绝对中心是指该点离最远的点的距离最小。
预处理最短路,如果中心在顶点上答案是离其最远的点。如果中心在一条边上,在一个源点从 \(u\) 向 \(v\) 移动的过程中,把图上每个顶点到该点的最短路变化看作函数,函数图像是一条斜率固定的折线。
我们把 \(u,v\) 到图上的点的距离排序,按照 \(dis_{u,i}\) 从大到小考虑。设 \(p\) 是考虑过的 \(dis_{u,i}\) 中最大的那个,如果有 \(dis_{v,i} > dis_{v,p}\) 那便会产生一次新的贡献,此时 \(dis_{u,i} + x\) 和 \(dis_{v,p} + (w-x)\) 一定同时是最长路径,由此计算更新答案。
CF1495D BFS Trees
- 多源 BFS 树
给定多个源点,求一棵树,满足每个点到任一源点的最短路都等于树上距离。
这个东西存在的必要条件之一是任意两个源点的最短路唯一(而且似乎必须构成一条链)。除了位于任意两个源点最短路径上的点,其他所有点还都必须能找到至少一个符合每个源点最短路树性质的父节点。 —— LFCode
CF1514D Cut and Stick
- 莫队维护区间众数个数
设 \(x\) 为区间众数个数,则答案为 \(\max\{1, 2x - len\}\),这个结论手模即可。然后莫队记录一下每个数的出现次数和出现次数的出现次数就可以维护了。
CF1580C Train Maintenance
- 图论技巧:补图上做 BFS
设 \(x\) 为所有边边权异或和,对于未给定边,只有一条边边权为 \(x\),其他为 \(0\)。(观察不难发现)
分类讨论。先假设所有边边权为 \(0\),用 920E 的做法得到多个连通块,如果还有未给定的边没用直接跑个 Kruskal 完成,否则看看能不能用给定的边替换这个 \(x\)。
CF1580C Train Maintenance
- 根号分治/根号平衡复杂度思想
设一个阈值 \(s\) ,如果 \(x_i + y_i \le s\) ,即循环节 \(\le s\) ,暴力修改下这个 \(i\) 在循环节为 \(x_i + y_i\) 时各个位置的贡献。
如果 \(x_i + y_i > s\),利用差分数组在整个序列上修改。总复杂度 \(\mathcal O(m (\frac{m}{s} + s))\),当 \(s = \sqrt m\) 时最优。
CF920E Connected Components?
给你一张 \(n\) 个点 \(m\) 条边的图,求它的补图有多少连通块。
- 图论技巧:补图上做 BFS
用一个队列储存所有未访问节点,每次查询当前节点与队列中所有节点之间是否有连边,把有连边的点再丢回去。
一个点被丢回队列里等价于找到了一条不存在的边,因此复杂度是正确的。线性或带一个 log。
LG-P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
线性空间区间众数
- 分块
块块之间预处理,用值域 vector 存每个元素位置,暴力增大答案。
增大答案时可以转化成 \(x\) 在集合中的位置,然后查询向后延伸 \(a\) 个后的位置是不是 \(\le\) 这次询问的区间 \(r\)。
Loj#6276 果树
一棵树,树节点有颜色,一条路径有 \(1\) 贡献当且仅当路径颜色各不相同,求总贡献。
特殊信息:每种颜色出现次数不超过 \(20\) 次。
- 扫描线
根据特殊信息,考虑枚举相同的颜色点对 \(x,y\),路径两端点在两点子树内便不合法。用 dfs 序把树拍成序列,然后两端区间就可以映射到二维平面上的一个矩阵,矩阵内的点不合法。对所有不合法矩阵求面积并,一减即可。
Tip:注意计算扫描线开多大数组。
P3201 [HNOI2009] 梦幻布丁
- 启发式合并
启发式合并例题。使用链表维护每一种颜色。一共有多少段颜色可以转化成 \(a_i \not = a_{i-1}\) 的个数。
P5290 [十二省联考 2019] 春节十二响
- 启发式合并
灵活运用 STL 中的大根堆。两个子树合并的时候贪心用大的元素和大的元素合并。swap 两个堆如果不开 C++11 复杂度是 \(O(n)\) 的,可以用 \(id_i\) 去指向其对应的堆。
牛客挑战赛57-C-树上行走
- 树链剖分
对于一个点,贡献只会由相邻的点得到,我们只记录它的父亲和重儿子产生了几次贡献。对于轻儿子,我们直接另开一个数组修改,因为修改最多只会跳 \(\log\) 次,轻儿子的修改不会使复杂度更低。
P3302 [SDOI2013]森林
- 启发式合并
启发式合并 + 主席树重构,在线
P2387 [NOI2014] 魔法森林
- Link-Cut-Tree
两元最小生成树问题,贡献统计方式为两元之和。对一维排序可以消除其影响,对另一维用 LCT 动态维护,需分类讨论成环与否等情况。
P4842 城市旅行
- Link-Cut-Tree
根据题意推出统计贡献的公式,然后把公式拆开进行维护。Push_up 和 Push_down 都需要仔细考虑如何维护。推式子的过程中需用到了一点小学奥数?
P4332 [SHOI2014]三叉神经树
- Link-Cut-Tree
需要大量手模来推性质,发现每次修改一定是叶子到根的一个后缀。然后可以直接维护出最后这个节点的位置。把这个节点转到其 Splay 的根,自己单独修改,自己的右子树进行区间 +1/-1 操作即可。有一个维护的值是 !=1 的位置 和 !=2 的位置,手推发现修改的时候可直接将他们交换。
bzoj2959 长跑
\(n\) 个点,点有边权,维护三个操作:加边,单点修改,求两点之间的最长距离(每条边可以经过多次,但方向必须一致)。
- Link-Cut-Tree + 边双连通分量
LCT 维护边双连通。如果没有环的话显然直接维护一段路径的和即可。如果出现了环,因为环上所有点都能经过,所以可以将其缩成一个点,把边权上的所有信息都放在一个点上。缩点的时候用 dfs 暴力缩即可。
因为这题没有删除,所以可以用并查集判断连通性,findroot()
会 T 掉。