蒟蒻日记_7月

7月来了,该卷题了。


07-01

· 【数学专题·函数】【NOIP2016提高组】愤怒的小鸟

状压DP,二次函数

首先要注意到预处理某两个点所在抛物线的经过点的集合,然后就得到了 \(O(n^22^n)\) 的状压 DP 算法。
然后我们把状压看做搜索的记忆化,可以想到转移的时候钦定集合的补集中的第一个点一定是被转移到的集合中的元素,就可以做到 \(O(n2^n)\)

· 【图论】最短路

最短路

一道板子题硬生生出成了毒瘤题。
阴间读入方式,加上 \(n=1e6,m=1e7\) 的离谱数据,和相较来说有点小的空间(200M),使得vector被卡空间,且必须开O2
我真的会屑

· 【图论】穷游

最短路,建图

边权赋成 \(d-2c\) 跑个最长路就好了, Floyd 和 SPFA 都可以。

· 【图论】灌水

最小生成树

另建一个点代表所有水流的来源,跑个 Prim 即可。

· 【图论】缩减预算

最小生成树

边权赋成 \(c_u+c_v+2l_i\) 跑 Kruskal 。

· 【图论】攀岩

BFS最短路

首先建图的时候可以按照 \(x\) 坐标排序再判断哪些点对距离小于 \(1000\) ,然后因为两点间的距离不小于 \(300\) 就可以发现需要判断的点对大约是 \(1e7\) 的量级。
然后边权都是 \(1\) ,跑 BFS 即可。


07-02

md上午一个FMC,下午一场模拟赛,6点还有讲评,8点的ABC直接被我咕咕。
人要做傻了。

· 【模拟赛#1】B 独木桥

二分,排序

赛时没调出来www
正解做法是根据坐标排名不变做到 \(O(n\log n+q\log^2n)\)
然后我搞出来一种奇怪的做法做到 \(O(n\log n+q\log n)\)
不过因为常数比双 \(\log\) 还要慢(?

· 【模拟赛#1】 C XOR

数学

注意到 \(\gcd(a,b)\le a-b\)\(a\oplus b\ge a-b\) ,因此有 \(\gcd(a,b)=a\oplus b=a-b\)
枚举一下即可。
还依此搞了个整活卡常题
std要AC都得看脸

· 【模拟赛#1】 D 番茄采摘

树形DP,背包DP

对答案DP后就是树上背包DP板子,记住——转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!转移不能用原数组转移!!


07-03

· 【数据结构】叠箱子

并查集

几乎是路径压缩的板子

· 【数据结构】羽毛球比赛

树状数组

直接用树状数组搞一搞逆序对完事

· 【数据结构】完美序列

DP,树状数组

\[dp_i=\sum_{|i-j|\le d}{dp_j}+1 \]

BIT维护一下就 \(\mathcal{O}(n \log n)\) 做完了。

· 【数据结构】钩子

线段树

一个只要写update的线段树…

· 【数据结构】厨神大赛

ST表,前缀和,双指针

双指针判断一下用ST表维护一下区间最小值即可。

模拟赛

打了一场模拟赛。打完估分 \(50+100+20+0\) 结果 \(100+100+88+0\)
贪心只挂了一个点是我没想到的

· 【模拟赛#2】分硬币

模拟

以为模拟会假,其实复杂度是 \(O(\log n)\) 的……

· 【模拟赛#2】采蘑菇

dp

一个很简单的DP


07-04

今天返校,晚上团建,就没写题~


07-05

· 【模拟赛#2】建设工程

二分,最小生成树

要求 \(\frac{f-\sum{c}}{\sum{t}}\) 的最大值。
赛场想了个赋边权为 \(\frac{\frac{f}{n-1}+c}{t}\) 的错误贪心,结果只挂一个点???
正解是二分利润 \(x\) ,于是有:

\[\frac{f-\sum{c}}{\sum{t}}\ge x\iff f\ge \sum(tx+c) \]

赋边权跑kruskal即可~
教训是:遇到没法一次判断出结论的题,尤其是最小/最大化的问题,要想到答案能否快速判断从而使用二分答案的算法。

UPD@07-22:发现这玩意儿叫0/1分数规划。

· 【树上问题】牧场行走

LCA

几乎是LCA板子题…

· 【树上问题】树网的核

树形DP,树的直径,单调队列

这题蛮不(du)错(liu)的
记住一点:这种有直径的问题,多半可以只考虑一条直径
然后选取一条直径记录一下直径上每个点与直径外的点的最大距离,然后注意到直径的性质,不用考虑没有被“核”上对应的点包含且不直径上的点,所以可以直接跑个单调队列求解。
代码有、长,不过相比于 DS 题和模拟题其实还好


07-06

· 【模拟赛#2】隐藏石子

DP

这题看到的时候是没有思路的!记得复习!
怎么说呢,就是这种比较难以考虑的题目似乎都可以考虑DP。
首先可以有几个观察:

  • \(k\le 30\) 因此石子的数量限制是假的;
  • 每个偏移量下的石子减少数是固定的。

然后就可以DP每个偏移量,DP出最多隐藏几个石子。
想到DP就不难了,直接设计一个 \(\mathcal O(k^3)\) 的状态就做完了,跑得飞快。

· 【树上问题】【NOIP2013提高组】货车运输

最小生成树,倍增

首先注意到,这是树上问题的练习题!
所以可以想到跑一个最小生成树,按照边权从大到小的顺序加边,可以保证货车在树上的路径一定是可运输的货物最大的路径。
然后之后的询问用倍增处理一下就好了。
但是做完后也一定要想:如果这题不在树上问题的练习里,我能不能想到用最小生成树!

· 【数据结构】海报

扫描线,线段树

用扫描线倒序扫描每一根线,query就是用来扫描是否区间被完全覆盖,然后就做完了。
本来以为高度也不同是树套树的毒瘤题

· 【模拟赛#3】字符串的能量

模拟

· 【模拟赛#3】指引

贪心,set

经典模型了∈是
为什么正解和暴力只差5pts

· 【模拟赛#3】砝码

折半搜索

MEET-IN-THE-MIDDLE
一个很好的想法。把集合拆成左右两半,然后通过一些推柿子可以将两边的一些值对应以计算合法的集合。


07-07

· 【模拟赛#3】分组

DP

蛮不错的一道计数DP
\(dp_{i,j,k}\) 来表示前 \(i\) 个数,有 \(j\) 组可填,总代价为 \(k\) 的方案数,然后排序后用差分思想来保证 \(k\) 在转移时不下降,就可以做到 \(O(n^2k)\)
比赛时没做出来一方面是读错题了,另一方面我认为我即使读对题也不会想到用差分优化的思路,这是要学习的。

· 【动态规划】最长不下降子序列

DP板子

· 【动态规划】游园礼物

DP

那个经典的数字三角形的题的强化版,多加个状态的维度就好了

· 【动态规划】找零

背包DP

简单的完全背包,记得要用高精度或者__int128

· 【动态规划】安全防护

树形DP

很板的树形DP…

· 【动态规划】小明的难题

状压DP

TSP板子

· 【动态规划】决斗

环形DP

首先破环为链。
我想DP的最大的难度还是在状态的设计上,就比如这题。
一开始我设计的状态是区间 \([i,j]\) 内能够胜出的人,那么这个状态显然是不好表示的,转移也是 \(O(n^4)\) 的,那我们其实可以考虑将状态设计为单个的对象。
在这题里的巧妙设计就是把 \(dp_{i,j}\) 设计为 \(i,j\) 能否将 \([i+1,j-1]\) 内的敌人全部消灭,那么这个是可以 \(O(n)\) 转移的,我们就轻松地写完了。


07-08

· 【动态规划】【IOI2000】邮局

DP,四边形不等式,决策单调性

我们很容易能够想到把所有的居民分为连续的 \(p\) 块,其中第 \(i\) 块都向同一个邮局走,那么这个代价是确定的,因为邮局一定在中位数的位置。这样就得到了 \(O(pn^2)\) 的算法。
然后在纸上画一下,如果你没有记错四边形不等式的方向的话,你可以很容易发现这个代价函数 \(w(i,j)\) 是满足四边形不等式的。那么首先我们可以对每一维使用二分栈,做到 \(O(pn\log n)\) 。事实上这个方法就已经可以通过原题数据了。
同时注意到我们可以用 2D/1D 的优化,有决策点满足 \(d_{i-1,j}\le d_{i,j}\le d_{i,j+1}\) 可以做到 \(O(pn)\)
然后还可以用wqs二分之类的方法来进一步优化,但是很显然我不会了~

· 【模拟赛#4】飞车

贪心

一眼贪心,排序扫描即可

· 【模拟赛#4】积水问题

最小生成树

一个建模上很好的题。
这题的关键在于说想出来 “一个地方的最终积水高度就是外侧到里侧的路径最大值的最小值” 然后路径极值的极值是可以用最小生成树来解决的。

· 【模拟赛#4】大回环

单调栈

首先环形问题一律破环为链,然后注意到以计算以 \(i\) 为结尾的顺时针的合法区间是可以用单调栈来搞的,最后记录一下最大值和次大值的个数去一下重,就 \(O(n)\) 做完了。
然而我写了个sort直接挂成 70pts

· 【模拟赛#4】送包裹

建图,Dijkstra

赛时做法:
根据一个贪心:我们要绕过一个点,可以考虑经过他的四周的点。
然后我们离散化一下所有被考虑的点,变成一张 \(O(n)\times O(n)\) 的网格图然后跑 \(n\) 次 dijkstra 就可以 \(O(n^3\log n)\) 做完。

正解:
还是根据这个贪心,把 \(n\) 个点扩成 \(5n\) 个点,那么就可以直接枚举所有可能的边以建图,然后跑 \(n\) 次没有堆优化的 dijkstra(因为边比较密)就可以做到 \(O(n^3)\)


07-09

· 【数据结构】水平可见的线段

扫描线,线段树

魔改一下线段树,就可以了。
复杂度不会证明,在问老师。
老师没回

· 【强联通分量】学校网络

Tarjan,缩点

基本算是 Tarjan 缩点的板子了。
答案和入度为0以及出度为0的点的个数的最大值。
要记得特判单联通分量的情况。

· 【强联通分量】受欢迎的牛

Tarjan,缩点

嗯还是缩点。
具体就是说,我们注意到一个点要能够被所有点达到,它的出度一定为 \(0\)
这是因为如果有出度,那么这条边对应的点根据DAG的性质是无法达到这个有出度的点的。
不得不说XMOJ上的数据真的有、氵
甚至缩完点所有数据都是树

· 【强联通分量】电话网络

Tarjan,割点

算是割点的板子。
输入虽然简化了但是还是好毒瘤

· 【强联通分量】【JSOI2010】联通数

Tarjan,缩点

其实并不明白为什么要缩点
缩点后用bitset状压DP的玄学方法。

· 【强联通分量】【ZJOI2007】最大半联通子图

Tarjan,缩点,DP

仔细想一下会发现最后的半联通子图缩点后一定能够形成一条链,因此直接求一个关键路径就做完了。
注意一下因为要计数所以要去掉重边,然后要用如下代码来对vector的元素去重

sort(v.begin(),v.end());
auto pos=unique(v.begin(),v.end());
v.erase(pos,v.end());

· 【强连通分量】【APIO2009】抢掠计划

Tarjan,缩点,DP

发现和洛谷的缩点板子比较像,就先写了一份前者然后复制代码过来改了一下。
注意到起点一定是 \(s\) 所在的强联通分量,因此我们可以跑一遍dfs去掉所有 \(s\) 无法达到的点及其边,然后我们就可以直接做一遍拓扑排序把答案DP出来。


07-10

· 【算进】Necklace

最小表示法

几乎是最小表示法的板子。复健了一下。

· 【算进】低价购买

DP

一开始搞了个奇奇怪怪的DAG的做法,把值相同的日子缩成一个点,然后发现对3 2 4 3 的数据这个算法会认为LIS是3(悲
正解:首先算出来LIS,然后倒序扫描一遍能够转移的数并去重后转移方案数。

· 【模拟赛#5】【NOIP2006提高组】作业方案调度

模拟

一年前做过的题……
那时候还记得调了好几天,现在一遍过。

· 【模拟赛#5】贪吃蛇

BFS,状压

首先,“蛇”之所以有别于一堆点,就在于他是连续的,而蛇之长不盈 \(8\) ,所以可以考虑两个bit表示一个方向,从而达到状压这一条蛇的目的。
被虚假的数据范围坑了

· 【模拟赛#5】修路

结论题

嗯就是纯结论题。
很容易得到说每个连通块要么是一棵树,要么是一棵基环树。
对于树,我们钦定一个补修路的村庄,那么剩下的路的修建者都可以确定;
对于基环树,它一定是基环外向树,而环上的方向只有两个,因此方案数为 \(2\)


07-11

· 【哈希/ST表】珊瑚珠子

hash

直接一个哈希就做完了。
空间注意一下就彳亍了。

· 【哈希/ST表】反对称

hash,二分

和hash判断回文数比较像。
直接选定对称轴二分一下就彳亍了。


07-12

· 【模拟赛#6】master

DP

直接设计一个 \(dp_{i,j,k}\) 的状态表示 \(s_{1\cdots i}\)\(t_{1\cdots j}\) 修改不超过 \(k\) 次的最长公共子串。
似乎和枚举的复杂度一样。

· 【模拟赛#6】neworld

最短路

双厨狂喜
题目中的顺序是假的,直接一个网格图dij解决问题。

· 【模拟赛#6】merging

状压DP

双厨狂喜x2
数据范围一眼状压,然后可以用 \(m\) 位表示一行的分割情况。然后我发现转移很难搞,试图预处理,算法各种假,最后只有 \(\mathtt{20pts}\)
实际上,两行之间的转移可以 \(O(m)\) 处理,因此可以做到一个 \(O(nm2^{2m})\) 的状压DP。

这两天的效率极低,明天要振作起来!!!


07-13

· 【模拟赛#6】raytracing

线段树

双厨狂喜x3
赛时来不及做TAT
手写一个分数的比较,然后离散化斜率。
同一个方向的线段是好直接覆盖的,两个方向的线段要分开处理,各搞一颗线段树维护就彳亍了。
合并的时候要注意端点的问题。
以及 《如 何 治 疗 低 血 压》
image

· 【CSP-S2019】括号树

树形DP,栈

很简单的一道题。
注意到每个节点的合法括号子串与其父节点的区别就是结尾是该节点代表的括号的合法子串,因此可以以 \(dp_i\) 来表示改子串,转移的时候用栈记录一下没有被匹配的括号即可。

· 【CSP-S2019】Emiya家的饭

DP

很不错的一道DP题。
注意到“不大于 \(\lfloor\frac{k}{2}\rfloor\) ”是难以刻画的,因此我们可以改变为所有情况去掉有一个大于 \(\lfloor\frac{k}{2}\rfloor\) 的情况。
我们以 \(dp_{p,i,j,k}\) 来表示前 \(p\) 种口味,第 \(i\) 种选择了 \(j\) 种做法,其他选择 \(k\) 种做法。这个做法是 \(O(mn^3)\) 的,那事实上 \(j,k\) 的具体值是无所谓,有所谓的是 \(j-k\) 的值,这样就可以做到 \(O(mn^2)\)

· 【NOIP2018】赛道修建

二分,树形DP

比较套路的题。二分+贪心+树形DP解决。

· 【哈希/ST表】好点对

倍增,单调栈

做法和标签一点关系都没有
直接参考丹钓战的做法,一个倍增搞定,然后两个高度相同的点的去重要单独处理。
以及读入一定要加上cin.tie(0);cout.tie(0)


07-14

救命今天真的好摸

· 【模拟赛#7】polygon

扫描线

氵题,直接上扫描线,甚至不用线段树维护。
线段+与-的问题就是看线段的方向,以及注意到这种连着的图形每一条线段都一定有相同位置的线段对应,因此可以直接加上/减去一段线段的长度,而不用线段树维护。

· 【模拟赛#7】circle

二分,贪心

大氵题,最大值的最小值直接想到二分,然后check可以贪心,就做完了。
然而,我 \(n\)\(m\) 读反了,居然有 \(\mathtt{70pts}\) 也真是奇迹。

· 【模拟赛#7】树林

BFS

十分富有技巧性的一道题。
我们设置一堵墙,令点一定要通过该墙的一个方向再回到起点,就保证了最终是绕着树林回到起点的。


07-15

· 【数据结构/ST表】【NOI2010】超级钢琴

ST表,分治,贪心

这题做不出很不应该。
首先我们知道有一个经典的模型,就是在两个数组中取两个数,找到最小的 \(k\) 个和,这个是可以用贪心做到 \(O(n\log n)\) 的,那么现在这个问题放到区间上,首先能够想到用这个模型去处理它。
然后我们可以去看这个模型的本质,它实际上是取到了当前的值能够扩展到的最大值,因此我们可以在区间上取最大值来做到类似的贪心。而这一步可以很方便地用ST去完成。于是就 \(O((n+k)\log n)\) 做完了。

· 【CSP-S2020】函数调用

DAG,动态规划

很不错的一道题(指我不会做
注意到最终的查询只有一个点,因此可以考虑计算每个点对答案的贡献。
因此我们考虑DP出每个点在答案上被乘以的值,然后最终统计一下就好了。

· 【Codeforces】CF1705A Mark the Photogragher

贪心

· 【Codeforces】CF1705B Mark the Dust Sweeper

贪心

· 【Codeforces】CF1705C Mark and His Unfinished Essay

字符串,递推

倒序扫一遍,不停地更新查询的位置直到查询位置在原字符串内

· 【Codeforces】CF1705D Mark and Lightbulbs

思维

额怎么说呢。
就是赛时一眼看出来这个东西是把两个位置的变化交换了一下。算是经验?
看出来以后就直接看相邻位置的异或,记录一下下标统计就彳亍了。
记得要检查首位是否相同!
赛时因为这个吃了一发罚时

· 【Codeforces】CF1705E Mark and Professor Koro

数据结构,思维

首先我们可以看出来这是一个二进制的东西。
然后我赛时想出的方法是用一个set维护连续的1的区间。然后为了可以直接修改其中的一端,换成了map。敲了1h多,一发罚时后发现一个傻逼错误居然直接过掉了。

这题官方题解居然还有直接bitset暴力做的???
image
真·暴力碾标算

这次CF发挥的很好,最终在rating的人中 \(rk101\) 直接从灰名跳到快蓝名的位置。
赛时各种思路都很顺,除了在DS题上花了快一半的时间。
希望下次还能维持这种状态~


07-16

· 【NOIP2017提高组】逛公园

DP,最短路

我的嘴巴:这题里最短路构成DAG然后一层一层按照 \(k'\) 的值DP就行了。
我的大脑:这题我不会啊。
看完题解:我的嘴巴秒切一道紫题???
嗯确实就是按照DAG去DP,然后我没想清楚的是应该由 \(k'\) 向大于等于 \(k'\) 的值去转移。但是这种条件反射是极好的。
除此之外要去掉不可能出现在长度不超过 \(d+k\) 的路径上的点,并判 \(0\) 环(即无解的情况)。

· 【CSP-S2020】排水系统

高 精 度

按照题意跑拓扑排序,但是要写一个高精度的分数系统。
__int128 氵过。

· 【NOIP2021】报数

筛法

氵题,但是要注意最终查询也是可以预处理的。


07-17

今天啥都没干,因为要整理行李之类的事情就没什么效率。
明天开始数竞集训了,希望有良好学习氛围。

睡前还做了一题(?

· 【模拟赛#7】boss

最短路,线段树

很毒瘤的一题。
首先部分分十分好拿,一个暴力 \(O(m^2\log m)\)\(\mathtt{30pts}\) ,然后基环树的情况跑个最长路即可,也有 \(\mathtt{10pts}\) ,于是 \(\mathtt{40pts}\) 到账。
然后正解是一个很奇怪的东西。
我们考虑枚举删去边后的最短路经过了的一条边。
那么我们可以考虑经过这条边的最短路与原先最短路的差别,可以注意到中间不重合的一段是删去就存在最短路变成现在这条的可能性的。由于这是连续的一段,所以可以用线段树来维护这个最小值。
最后可以枚举最短路上的边来做到 \(O(n\log n)\)

这题的关键在于说去考虑枚举经过特定边的路径,同时要注意到考虑和原先最短路的差别。


07-18

晚上和寝室里的人一起打牌,摸了。

打了一场CF,但昨天没睡好,打一半跑路了。

· 【Codeforces】CF1706A Another String Minimization Problem

贪心

· 【Codeforces】CF1706B Making Towers

DP

\(i\) 表示颜色,\(j\in\{0,1\}\) 表示位置的奇偶。
\(dp(i,j)=dp(i,j\oplus 1)+1\) 来更新就好了。

· 【Codeforces】CF1706C Qpwoeirut And The City

DP

\(n\) 为奇数,情形唯一; \(n\) 为偶数,一定会有且仅有 \(1\) 个位置相邻之间的相差不是 \(1\) 。用DP搞一下就好了。


07-19

怎么住宿的人除了我都是数学小班的,被抛弃了。

草死了,昨天的CF居然上分了,估计是新手保护。
直接上蓝,快乐~

· 【NOIP2021】数列

DP,数数

真题给我做傻了
感觉这种计数的题目并不熟练。
这题的主要思想就是从低到高进行进位来消除后效性,那么这样子我们可以搞出一个很好的DP柿子,可以 \(O(n^3mk)\) 通过。

\[dp(i,j,l,q)=\sum_{x=0}^{\min\{j,2q-x+1\}}{v_i^x\binom{n-j+x}{x}dp(i-1,j-x,l-1,2q-x+1)}+\sum_{x=0}^{\min\{j,2q-x\}}{v_i^x\binom{n-j+x}{x}dp(i-1,j-x,l,2q-x)} \]

然而,€€£给的样例十分之小,我甚至没法检查出我的数组开小了。最后一维应当是二倍空间。

· 【Codeforces】CF1706E Qpwoeirut And The City

最小生成树,LCA,ST

这题挺套路的,感觉赛时没看亏大发(
很显然可以给第 \(i\) 条边赋一个 \(i\) 的边权,然后对于 \(a\)\(b\) 联通需要的边数就是 \(a\)\(b\) 的路径上的最大值的最小值,而这个是有一个套路的:最小生成树上的路径一定满足最大值最小。
于是我们一个 kruskal 建树,然后再写个倍增lca。
现在我们要求一段连续的点联通,那么实际上我们可以把 \([l,r]\) 联通转化为 \(l\)\(l+1\) 联通, \(l+1\)\(l+2\) 联通……这个可以预处理,而查询实际上只是找这些的最大值,这显然是一个RMQ问题,用ST求解即可。


07-20

嘿嘿,被封在学校里了。

· 【Codeforces】CF1706D Chopping Carrots

数论分块

这题还是十分不错的。注意到 \(\lfloor\frac{a_i}{p_i}\rfloor\) 的所有取值是 \(O(n\sqrt n)\) 的,因此我们可以将这些值全部列出来然后双指针。
然而,这题是卡空间的(悲
那么我们可以用上桶排的思想,因为这些值是可以递推的,且递推出来的具有单调性。
然后用vector及时清空空间就可以通过了。
注意,vector的释放内存是这样的:

vector<int>().swap(vec_name);

· 【数学专题·积性函数】求质数

欧拉筛

欧拉筛板子

· 【数学专题·积性函数】可见坐标点

欧拉函数,欧拉筛

显然答案是 \(2\sum\limits_{i=1}^{n}{\varphi(i)}-1\) 直接做即可

· 【数学专题·积性函数】法雷序列

欧拉函数,欧拉筛

和上一题几乎一样

· 【数学专题·积性函数】转圈

快速幂

……

· 【数学专题·积性函数】LCM

欧拉函数,欧拉筛

开始整有趣的了
考虑枚举 \(\gcd(i,n)=d\) ,然后每种情况的难点就是一个 \(\sum\limits_{i=0}^{\frac{n}{d}}{\varphi(i)i}\)
而这个可以根据与 \(\frac{n}{d}\) 互素的数可以一一对应来计算。
\(O(T\sqrt n)\) 常数极小,可过。

· 【数学专题·积性函数】gcd

欧拉函数,欧拉筛

也是考虑枚举 \(gcd\) ,然后每一种情况计算的是 \(f(x)=\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{x}{[\gcd(i,j)=1]}\) ,而这玩意儿实际上就是欧拉函数的前缀和的两倍减一。

· 【算进】奶牛矩阵

KMP,hash

两个方向分别算nxt数组,两个方向最小循环节分别是 \(r-nxt[r]\)\(c-nxt[c]\)


07-21

得知可以回家就摸了一天的鱼(
加上有数竞课程影响,完全没有效率。


07-22

· 【模板】矩阵加速(数列)

线代板子

之前听选修课的老师说矩阵就是给计算机计算的(喜

· 【数学专题·递推数】 约数个数

欧拉筛

直接欧拉筛走起

· 【数学专题·递推数】 约数平方和

欧拉筛

还是欧拉筛,记录一下最小质因数 \(p\) 及其次数 \(c\) ,然后其对答案的贡献为 \(\sum\limits_{i=0}^{c}{(p^2)^i}\)
然后直接筛的时候递推一下即可。

· 【数学专题·递推数】有趣的数列

斐波那契数,欧拉筛

这题本质上是前两题的二合一,不过套了一层Fib的壳。
我们有 \(\gcd(Fib_n,Fib_m)=Fib_{\gcd(n,m)}\) ,因此对询问可以直接考虑 \(i\) 的约数个数和平方和。
但是,我们注意到 \(Fib_2=Fib_1=1\) ,因此我们需要特判没有算上 \(Fib_2\) 的情况。

· 【算进】匹配统计

KMP

首先有一个很明显的带 \(\log\)\(\mathrm{hash}\) 做法,对每一个 \(A\) 的前缀二分即可,复杂度是 \(O(n\log n+m+q)\) 的。

那事实上是可以用 \(\mathrm{KMP}\) 搞出线性算法的。

我们求出 \(nxt\) 数组与 \(f\) 数组,然后就可以求出 \(A\) 中每个前缀的最大的 \(B\)\(\mathrm{border}\)
我们用 \(cnt[i]\) 来记录长度为 \(i\) 的最大 \(\mathrm{border}\) ,然后我们利用 cnt[nxt[i]]+=cnt[i] 来递推即可得知 \(A\) 中出现的长度为 \(nxt[i]\) 的所有 \(\mathrm{border}\)
然后我们就有答案为 \(cnt[x]-cnt[x+1]\)

这题还是挺考验对 \(\mathrm{KMP}\) 算法的理解的,事一道好题(喜


07-23

· 【数学算法·递推数】有趣的序列

Catalan数

不难想到一个其与括号序列的一一对应,于是直接计算卡塔兰数。
\(n\le 1e6\)\(p\) 不一定是质数,没法直接用逆元算,因此利用公式

\[cat_n=\frac{\binom{2n}{n}}{n+1}=\frac{2n!}{n!n!(n+1)} \]

分解质因数计算。

· 【数学算法·递推数】代码

Catalan数

注意到大小为 \(k\) 的二叉搜索树个数为 \(cat_k\) ,并且第一位的字符只和左子树的大小有关,因此可以分而治之。
预处理出卡塔兰数递推过程中的前缀和,然后进行一个二分,得出左子树的大小为 \(k'\) 那么就有 左子树的排名为 \(\frac{n-1}{cat_{k-k'-1}}+1\) ,而右子树则是 \((n-1)\mod cat_{k-k'-1}+1\)

· 【模板】乘法逆元

数论板子

inv[i]=inv[i%p]*(p-p/i)%p

· 【模板】乘法逆元2

数论板子

倒推法

· 【模板】组合数取模

数论板子

算阶乘逆元即可


07-24

· 【数学算法·逆元】【SDOI2008】沙拉公主的困惑

数论,逆元

不难看出答案是 \(\frac{N!}{M!}\varphi(M!)\) 预处理逆元计算即可。

· 【模板】中国剩余定理

数论板子

· 【数学算法·逆元】路径的数量

组合数学,数论

用组合数计算,计算过程用预处理的阶乘逆元。

救命为什么又要收拾行李啊啊啊啊啊


07-25

· 【模板】扩展中国剩余定理

数论板子

打了一场月赛,挂成渣渣

· 【7月月赛】Div1A. 偶数距离

贪心

其实就是二分图
一个DFS解决

· 【7月月赛】Div1B. 函数最小值

维护一下中位数即可。但是写挂了啊啊啊啊啊(已疯)


07-26

· 【数学·容斥】集合计数

容斥,二项式定理

用容斥列出柿子

\[\begin{aligned} &\sum_{t=0}^{2^n}\sum_{i=0}^{n}\binom{2^{n-i}}{t}\binom{n}{i}(-1)^i\\ =&\sum_{i=0}^{n}\sum_{t=0}^{2^n}\binom{2^{n-i}}{t}\binom{n}{i}(-1)^i\\ =&\sum_{i=0}^{n}2^{2^{n-i}}\binom{n}{i}(-1)^i \end{aligned} \]

然后就可以 \(O(n)\) 地做了。

· 【数学·容斥】分特产

容斥

\[\sum_{i=1}^{n}\binom{n}{i}\prod_{j=1}^{m}\binom{x_j+i-1}{x_j} \]


07-27

· 【数学·容斥】【NOI 2010】 能量采集

欧拉反演,整除分块

这题的欧拉反演还是挺巧妙的,学到了。

利用 \(\sum\limits_{d|n}\varphi(d)=n\) 我们可以得到:

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^m\gcd(i,j)\\ =&\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\varphi(d)\\ =&\sum_{i=1}^n\sum_{j=1}^m\sum_{d}\left[d|i\right]\left[d|j\right]\varphi(d)\\ =&\sum_{d}\sum_{i=1}^n\left[d|i\right]\sum_{j=1}^m\left[d|j\right]\varphi(d)\\ =&\sum_{d}{\left\lfloor\frac{n}{d}\right\rfloor}{\left\lfloor\frac{m}{d}\right\rfloor}\varphi(d) \end{aligned} \]

然后就可以整除分块 \(O(\sqrt n+\sqrt m)\) 做完了~

· 【数学·组合数】盒子

容斥,DP

可以DP,也可以容斥
DP是 \(O(n^2)\) 的,容斥做法可以快速幂因此是 \(O(n\log n)\)
整活了一下

· 【数学·组合数】组合数的末九位

组合数

显然没法直接用逆元计算了,因此考虑分解质因数。
复杂度大约是十分跑不满的 \(O(n\log n)\)


07-28

摸了,不知道干啥事去了


07-29

· 【数学·组合数】多项式相乘

组合数

就是一堆细节以及要防止爆int


07-30

· 【数学·组合数】零多的数

组合数

也是一堆细节以及要防止爆数组

· 【7月月赛】Div1D. 双色球

DP,计数

很有技巧的一道计数题。
我们常常会在设计状态的时候规避掉有可能产生重复计数的状态,然而有时我们也可以钦定一个“有效”的状态。
比如这题中直接考虑初始状态显然会算重复,但是我们注意到我们DP的东西可以看做一条曲线。因此我们把所有的曲线都尽量向下移动。这在程序里体现的就是指计算经过 \(0\) 的曲线。

· 【7月月赛】Div1C. 清理石头

结论题

纯纯结论题,主要还是赛时没有花时间想。

· 【数学·Lucas定理】储存坚果

Lucas

注意到答案是 \(\binom{n+m}{n}\) 因此我们直接用lucas计算就好了

· 【模拟赛#1】围墙

结论题


总结

本月做了 \(114\) 道题。虽然含有大量板子,但是在同时参加数竞集训的情况下效率十分不错了。
8月继续加油啊!

posted @ 2022-07-01 09:59  思考人生中…  阅读(45)  评论(0编辑  收藏  举报