摘要:
数论是数学对正整数进行研究的分支。筛法最初起源于找出质数的过程中。以下将浅谈数论中各种各样的筛法以及它们的应用。 质数,是指除了 \(1\) 和本身之外不能被任何正整数整除的数,即恰好只有两个因数。于是不难写出以下判断代码: bool isPrime(int x){ for(int i=2;i<=x 阅读全文
posted @ 2025-09-08 20:57
FormulaOne
阅读(26)
评论(0)
推荐(0)
摘要:
一个非常经典的套路是把所有括号从左到右压入栈中,如果栈顶能与当前的配对则消去。这样做符合题目中只能消除相邻括号的要求,并保证能消除的立刻消除,从而是正确的。最后判断栈是否为空即可。 时间复杂度 \(O(n)\)。 #include <iostream> #include <cstdio> using 阅读全文
posted @ 2025-09-08 18:46
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
模拟样例可以发现,操作本质上是将形如若干个 W 加上一个 A 的字符串变为同样长度的一个 A 加上若干个 C 的字符串。于是按照这个规则找到并替换这样的字符串即可。 时间复杂度 \(O(n)\)。 #include <iostream> #include <cstdio> using namespa 阅读全文
posted @ 2025-09-08 18:45
FormulaOne
阅读(13)
评论(0)
推荐(0)
摘要:
比较简单的 LIS 模板题。 回顾使用树状数组求解 LIS 问题的过程:用树状数组的下标表示 \(a\) 的值域,存储 \(f\) 的最大值。求解时在 \([1,a_i-1]\) 上取最大值,并更新到 \(a_i\) 对应的位置。 类似地,在本题中,询问前 \(R\) 个数且值不超过 \(X\) 的 阅读全文
posted @ 2025-09-08 18:45
FormulaOne
阅读(13)
评论(0)
推荐(0)
摘要:
由于 \(a_i \le 10^6\),故可以一遍求出 \([1,10^6]\) 内每个数的因数以及这个数的倍数在 \(a\) 中的出现次数。求完后对每个 \(a_i\) 暴力枚举因数,判断其倍数出现次数是否超过 \(k\) 并更新答案即可。 总时间复杂度 \(O(N\log N+nd(a_i))\ 阅读全文
posted @ 2025-09-08 18:45
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
有一个显然的结论,即最中间的 \(1\) 是固定不动的。考虑反证,假设左右各有 \(k\) 个 \(1\),且所有 \(1\) 不是往正中间的 \(1\) 移动,那么一侧 \(k\) 个移动距离减小,另一侧 \(k\) 个移动距离增加,显然不会更优,因此结论得证。\(n\) 为奇数时,最中间只有一个 阅读全文
posted @ 2025-09-08 18:44
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
直接按照题意模拟即可。如果输入的边已经存在或构成自环,则直接删去即可。注意需保证 \(u,v\) 的大小关系不变,判断边是否存在可使用 map。 #include <iostream> #include <cstdio> #include <map> using namespace std; map 阅读全文
posted @ 2025-09-08 18:44
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
树链剖分模板题。边权转点权的操作十分经典,用两个点中深度较大的存储边权(因为父亲唯一),然后就转化为点权的操作了。轻度卡常即可通过,比如线段树查询时写非递归版等。 时间复杂度 \(O(n \log n + q \log^2 n )\)。 #include <iostream> #include <c 阅读全文
posted @ 2025-09-08 18:44
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
A 性质 首先使用差分维护每个 \(a_i\) 的操作次数。 不难发现由于数的种类很少,因此直接用一个数组记录每个数 \(i\) 操作 \(j\) 次后的值。预处理完后,记 \(A\) 为 \(a_i\) 的最大值,则时间复杂度 \(O(mA)\)。 for( int i = 1 ; i <= 10 阅读全文
posted @ 2025-09-08 18:43
FormulaOne
阅读(29)
评论(0)
推荐(0)
摘要:
比较经典的生成函数题目。 不难发现题目中 \(B-A=C-B\) 可以化为 \(A+C=2B\)。于是问题转化为:对于一个给定的数 \(k\),在 \(S\) 中选两个数使它们的和为 \(k\)(这个 \(k\) 即是原来的 \(2B\))。 接着读题可以发现,\(S\) 是集合(即 \(S_i\) 阅读全文
posted @ 2025-09-08 18:43
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
读题可以发现,一个大的区间的答案是由三个小的区间的答案决定的。同时又要支持单点修改,因此可以用一个数据结构维护,比如线段树。在这个线段树中,每个非叶子节点有三个子节点。先建好原始的树,修改时定位到叶子节点,再向上更新答案即可,与普通线段树的操作类似。 时间复杂度 \(O(n+q\log n)\)。 阅读全文
posted @ 2025-09-08 18:43
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
除了树套树做法外,整体二分也是可以的。 整体二分的主要思想是:通过对值域进行一次二分,来求多个区间排名,从而替代了树套树中的权值线段树。具体地,我们把所有操作按时间先后顺序确定后,假设当前的值域中点为 \(mid\),那么按原顺序进行所有修改值不超过 \(mid\) 的操作,用对应的下标更新树状数组 阅读全文
posted @ 2025-09-08 18:42
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
考虑计算每对 \((a_i,a_j)\) 的贡献,即计算当 \(a_i\) 为最小值,\(a_j\) 为最大值时的方案数。将 \(a\) 排序后,显然 \((i,j)\) 中的元素可选可不选,\(i,j\) 必选,\([1,i)\) 和 \((j,n]\) 必不选,共有 \(2^{j-i-1}\) 阅读全文
posted @ 2025-09-08 18:42
FormulaOne
阅读(14)
评论(0)
推荐(0)
摘要:
点分治 适用于统计路径、点对问题: 核心思想:以当前子树的重心作为当前节点,将该子树内路径分为两类: 不经过重心,到子树递归即可 经过重心,直接计算每个点到重心的信息,用双指针等计算答案。 在重心处统计答案可能会有不合法(如同一子树两个点,先过来重心再原路返回),考虑容斥,先算总的,再算每棵子树独立 阅读全文
posted @ 2025-09-08 18:41
FormulaOne
阅读(19)
评论(0)
推荐(0)
摘要:
发现直接维护区间内每个数的出现次数并不好做。不妨把这个条件外推,假设 \([l,r]\) 中每个数的出现次数都是 \(k\) 的倍数,那么 \(\sum_{i=l}^r a_i\) 也是 \(k\) 的倍数,即后者是前者的必要条件,并且当 \(a_i\) 较大时,后者成立时前者成立的概率会越大。 因 阅读全文
posted @ 2025-09-08 18:39
FormulaOne
阅读(20)
评论(0)
推荐(0)
摘要:
赛后发现漏了一个显然性质,然后就过了,还是要多练。 这个显然性质是:如果有两个人初始等级分分别为 \(x,y\) 且 \(x<y\),那么在经历若干次比赛后,则 \(x\le y\),即相对大小不变化。为什么正确呢?对于一场比赛,如果 \(x\) 加分,\(y\) 不加分,则 \(x\) 最多与 \ 阅读全文
posted @ 2025-09-08 18:39
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
考场上读成数所有正方形的个数了,过了好久才发现是简单题。 考虑除了圆心所在行和列以外的格子分布状况。由圆的对称性可知,只需求出 \(\frac{1}{4}\) 个圆的格子个数即可。不难发现当横坐标确定时,最大的纵坐标也是确定的。于是可以直接枚举横坐标,并二分确定最大的纵坐标,即可获得该行的格子数量。 阅读全文
posted @ 2025-09-08 18:39
FormulaOne
阅读(14)
评论(0)
推荐(0)
摘要:
后记已经写了一部分。 Day 0 少上了几节课,又做了几道 POI 的经典题目,对明天比赛的信心勉强突破了 \(0\)。 Day 1 一大早到学校集中,然后坐大巴车去深圳。 深高果然又新又大,与大学十分相似。 发现本校的高中生基本在同一个考场,右边的右边是 ztz。 开考了。 把所有题看了一遍,T1 阅读全文
posted @ 2025-09-08 18:38
FormulaOne
阅读(14)
评论(0)
推荐(0)
摘要:
首先不难写出 \(O(n^2)\) 的 dp。设当前在第 \(i\) 个位置,从前面选择一个位置 \(j\),并加上 \([j+1,i]\) 这一段的贡献(可以预处理),取最小值即可。 #include <iostream> #include <cstdio> #include <map> usin 阅读全文
posted @ 2025-09-08 18:38
FormulaOne
阅读(17)
评论(0)
推荐(0)
摘要:
一眼 dp。 设 \(f_i\) 表示从第 \(i\) 个位置出发能跳到的最大值。考虑从后往前枚举,对于当前位置 \(i\),其往前跳到的最大值即为 \(a\) 的前缀最大值。而如果先往后跳,那么就可以跳到比 \(a_i\) 小的位置。而这些位置能跳到的最大值已经计算好了,因此可以直接使用。转移的位 阅读全文
posted @ 2025-09-08 18:38
FormulaOne
阅读(8)
评论(0)
推荐(0)
摘要:
小清新构造题。 对 \(n\) 按奇偶性分类讨论。当 \(n\) 为偶数时,一个显然的构造形如 \(1,1,2,2,\cdots,n\div2,n\div 2\),相同的数之间距离是 \(0\) 和 \(1\),符合条件。 当 \(n\) 为奇数时,结合条件可知有一个数要出现 \(3\) 次。考虑将 阅读全文
posted @ 2025-09-08 18:37
FormulaOne
阅读(6)
评论(0)
推荐(0)
摘要:
提供一个比较好想的思路。 读题发现给定的序列是一个排列,即任意两个数互不相同。考虑 \(n\) 这个数,它只能与 \(n-1\) 交换,因此它要么在第 \(n\) 个位置上,要么在第 \(n-1\) 个位置上,且在后者情况下必须满足 \(p_n=n-1\) 才能有解。将 \(n\) 固定下来后,\( 阅读全文
posted @ 2025-09-08 18:37
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
为了方便思考,以下分析满足条件 \(i<j\)。对于 \(i>j,a_i<a_j\) 的情况,则转化为 \(i<j,a_i>a_j\)(前后对调)。 先分析 \(i<j,a_i<a_j\) 的情况。显然,必须要满足 \(a_i \le a_{i + 1} \le a_{i + 2} \le \cdo 阅读全文
posted @ 2025-09-08 18:36
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
题意 给定 \(n\) 个点,\(m\) 条有向边,每条有向边从 \(u_i\) 指向 \(v_i\),边权为 \(w_i\)。构造一个长度为 \(n\) 的整数序列 \(x\),满足: \(-10^{18} \le x_i \le 10^{18},1 \le i \le n\)。 \(x_{v_j 阅读全文
posted @ 2025-09-08 18:36
FormulaOne
阅读(17)
评论(0)
推荐(0)
摘要:
题意 给定两个长度为 \(N\) 的序列 \(A,B\),求 \(A_i+B_j(1 \le i,j \le N)\) 的最大值。 \(1 \le N \le 5 \times 10^5,1 \le \left| A_i\right|,\left| B_j\right| \le 10^9\)。 解法 阅读全文
posted @ 2025-09-08 18:35
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
题目保证了一开始图为 DAG,因此入度和出度为 \(0\) 的点都是存在的。那么先找一个出度为 \(0\) 的点,再把所有入度为 \(0\) 的点进入队列。每次取出队首,与出度为 \(0\) 的点,进行一次操作。操作后,这个点的出度变为 \(0\),可以在下次操作使用(这样也保证了每个点的出度不超过 阅读全文
posted @ 2025-09-08 18:35
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
C \(N \le 8\),全排列即可。实现时可以使用 next_permutation。当然用康拓展开也没有问题。 以下代码时间复杂度 \(O(n!)\)。 #include <iostream> #include <cstdio> #include <bits/stdc++.h> using n 阅读全文
posted @ 2025-09-08 18:34
FormulaOne
阅读(7)
评论(0)
推荐(0)
摘要:
题目给定的是边权,不好处理,考虑把它转化为点权。具体地,在 dfs 的过程中,把边权当做子节点的点权即可,效果是一样的。接下来都以点权代替边权。 首先存在一个事实,任何一个点都不会经过 \(3\) 次或以上。从根节点向下遍历,从子节点向上回溯,一定会先遍历完一棵子树内的点,再去走另一棵子树内的点,因 阅读全文
posted @ 2025-09-08 18:34
FormulaOne
阅读(56)
评论(0)
推荐(0)
摘要:
有一个显然的贪心,即每次都取剩余权值和最大的一条路径。由于每个点的权值都只计算一次,因此这样做能够确保前 \(k\) 次得到的答案最大。假如不取大的而先取小的,那么答案一定不会优于前者(大的可能没取到),从而保证了贪心的正确性。 接下来考虑如何维护最大值。每一次求出最大值后,同时记录最大值对应的点的 阅读全文
posted @ 2025-09-08 18:33
FormulaOne
阅读(13)
评论(0)
推荐(0)
摘要:
首先我们要对 \(\sum_{i=1}^W \sum_{j=i+1}^W \min(c_i,c_j)\) 进行化简。具体地,一个 \(c_i\) 会产生贡献,当且仅当存在一个 \(c_j\) 满足 \(c_j \ge c_i\)。设这样的 \(j\) 的个数为 \(d\) 个,那么所产生的贡献为 \ 阅读全文
posted @ 2025-09-08 18:33
FormulaOne
阅读(15)
评论(0)
推荐(0)
摘要:
首先注意到题目给定的矩形以及要求的子矩形的顶点坐标均为整数,且每条边都平行于一条坐标轴。可以得知无需考虑矩形旋转一定角度的情况,接下来就不难了。 一个子矩形要把所有点覆盖,则只需要把最小、最大的横、纵坐标覆盖即可(显然,其他横、纵坐标在两者之间,因此一定能覆盖)。在此基础上,每条边可以向外延伸一定长 阅读全文
posted @ 2025-09-08 18:32
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
一道不错的题。 首先观察这棵树,得到以下事实: \(1\) 为树根。 树上的边是由父亲连向儿子的有向边。 除 \(1\) 以外的节点都有一条连向 \(1\) 的有向边。 边权为正。 可知任意两点间都存在最短路,且这条最短路是不难求的。假设要求从 \(u\) 到 \(v\) 的最短路,设 \(dis1 阅读全文
posted @ 2025-09-08 18:32
FormulaOne
阅读(21)
评论(0)
推荐(0)
摘要:
还剩半个小时才开始打入门赛,结果最后一题就差几分钟,恼火。 这是一道模拟题,因此我们要仔细梳理题目给的大量信息。通俗地理解,给定若干个表格,每个表格包含一行表头和若干组信息,并且有若干次询问,每次询问指定一个表格的一个关键字的内容,寻找该表格中对应关键字内容相同的信息,并输出另外指定的关键字的内容。 阅读全文
posted @ 2025-09-08 18:31
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
看到 \(\sum \limits_{i=1}^n a_i \le 10^9\),可以很快发现不同的 \(a_i\) 大约只有 \(42000\) 个。设去重后的 \(a_i\) 为 \(k\) 个,则不难得到一个 \(O(k^2)\) 的做法,可以获得 \(70\) 分。 for( int i = 阅读全文
posted @ 2025-09-08 18:31
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
模拟赛场切了,发篇题解纪念一下。 首先对题目中的不等式移项,得到 \(p \ge h_j + \sqrt{|i-j|} - h_i\)。对于右边部分的式子,\(h_i\) 是确定的,因此只需求出 \(h_j + \sqrt{|i-j|}\) 的最大值即可(也就是要求的最小高度)。 观察式子,发现 \ 阅读全文
posted @ 2025-09-08 18:30
FormulaOne
阅读(17)
评论(0)
推荐(0)
摘要:
虽然本题打着线段树的标签,但 \(10^5\) 的数据范围令我想到了简单粗暴的分块。 操作 \(1\) 首先考虑暴力判断并修改每个位置的值,然而这样做会被卡到 \(O(nm)\)。但实际上,需要修改的位置可能不多,也就是会做大量的无用判断。这个时候,我们就可以充分利用分块的特性,记录每个块内 \(a 阅读全文
posted @ 2025-09-08 18:30
FormulaOne
阅读(17)
评论(0)
推荐(0)

浙公网安备 33010602011771号