摘要:
最优的方案应该是先往一个方向走,然后走回来,再往另一个方向走不回来。考虑用 dp 模拟这个过程。设 \(f_{i,0/1}\) 表示从第 \(i\) 个点出发往左走,不一定/一定回到 \(i\) 号点的最大次数,则有转移: \[\begin{array}{l} f_{i,1}=f_{i-1,1}+a 阅读全文
posted @ 2025-09-12 19:42
FormulaOne
阅读(13)
评论(0)
推荐(1)
摘要:
大胆猜测,所有数的最大公约数一定很小:偶数时为 \(1\),奇数时为 \(2\)。设两个正整数 \(n,m\) 且 \(n<m\),最大公约数 \(\gcd(k^{2^n}+1,k^{2^m}+1)=d\),则有 \(k^{2^n}\equiv k^{2^m} \equiv -1\pmod d,k^ 阅读全文
posted @ 2025-09-12 19:41
FormulaOne
阅读(14)
评论(0)
推荐(0)
摘要:
根据贪心策略,应当选择 \(k\) 个最小的负数改为正数,或选择 \(k\) 个最大的正数改为负数,才可能使答案最大。那么可以先把数按正负分开,并确定每个数在同符号数中的排名。建立权值线段树,记录每个数出现的次数、单个数大小、总贡献和,查询时类似线段树二分,如果数值较大的区间不够用,就往数值较小的区 阅读全文
posted @ 2025-09-12 19:41
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
记字符集大小 \(A=26\)。 我们并不关心一段字符串怎么变化,只关心变化之后能得到什么字母。设 \(f1_{i,j,z}=0/1\) 表示字符串 \(s_1\) 的 \([l,r]\) 子串不可以/可以变成字母 \(z\)。枚举合并点 \(k\),则有 \[f1_{i,j,z} \leftarr 阅读全文
posted @ 2025-09-12 19:40
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
首先将弹珠按坐标从小到大排序。设 \(f_i\) 表示前 \(i\) 颗弹珠,强制固定第 \(i\) 颗弹珠的最小代价,则有显然的转移: \[f_i=\min_{1\le j <i}f_j+\sum_{k=j+1}^{i-1}(x_k-x_j)+c_i \]将和式展开,使用前缀和维护 \(x_k\) 阅读全文
posted @ 2025-09-12 19:40
FormulaOne
阅读(15)
评论(0)
推荐(0)
摘要:
将每个 01 串看作一个二进制数,将长度从小到大排序,对于当前第 \(i\) 个串,首先在第 \(i-1\) 个串的基础上加 \(1\)(如果不能加 \(1\) 即爆位数则无解),如果长度相同则无需任何操作,否则按照缺少的长度从后面补 \(0\)。这样做能保证长度短的不为长度长的前缀,且尽可能的多填 阅读全文
posted @ 2025-09-12 19:39
FormulaOne
阅读(6)
评论(0)
推荐(0)
摘要:
由于任意两个圆没有交点,故不存在翻一次栅栏能穿过两个圆。那么对于每个栅栏,如果两个点一个在内一个在外,则必须翻,否则不用翻。时间复杂度 \(O(mk)\),可以通过。 #include<iostream> #include<cstdio> #include<algorithm> #include<m 阅读全文
posted @ 2025-09-12 19:39
FormulaOne
阅读(21)
评论(0)
推荐(0)
摘要:
首先 \(1\) 的总个数不能被 \(n\) 整除时无解。 否则一定有解(因为每一列上的 \(1\) 的位置都可以随意变动,故实际上相当于可以随便放)。为了步数最少,一定是用缺少 \(1\) 行的 \(0\) 与过多 \(1\) 行的 \(1\) 交换,这样能同时使两行更接近答案。实现时先枚举列,再 阅读全文
posted @ 2025-09-12 19:39
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
挺神奇的思维题。 首先将所有元素按 \(a\) 从大到小排序,考虑交叉选,即要么 \(a_1,a_3,a_5,\cdots,a_{2n-1}\),要么 \(a_1,a_2,a_4,\cdots,a_{2n-2}\)。无论选哪种,\(a\) 一定满足要求(前者 \(a_1>a_2,a_3>a_4,\c 阅读全文
posted @ 2025-09-12 19:38
FormulaOne
阅读(13)
评论(0)
推荐(0)
摘要:
设 \(f_i\) 表示前 \(i\) 个事件发生后的最大收益,如果第 \(i\) 个事件是获得硬盘,则 \(f_i \leftarrow f_{i-1}\),否则二分找到最大的 \(j\) 使第 \(j\) 个事件得到的硬盘与当前需要的相同(尽可能减少对前面的影响。可以预处理每种硬盘对应的事件编号 阅读全文
posted @ 2025-09-12 08:18
FormulaOne
阅读(18)
评论(0)
推荐(0)
摘要:
考虑 dp。设 \(f_i\) 表示到位置 \(i\) 所需的最小花费,且第 \(i\) 个位置必选,现在要找上一个决策点 \(j\),这个点应该要在此前所有区间的左端点的后面,才能保证这些区间能被覆盖(即确保至少一个在之前每个区间内),则 \(j\) 应满足 \(\max_{r_k<i}l_k \ 阅读全文
posted @ 2025-09-12 08:17
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
发现不满足题意的情况就是一个节点到多个子节点的边的字母相同,那么合法当且仅当每个节点到子节点的字母互不相同。那么可以统计每个节点连接的字母数量,并运用类似换根 dp 的思路,快速更新这个数量并实时维护符合条件的点的数量即可。时间复杂度 \(O(nA)\),其中 \(A=26\) 为字符集大小。 #i 阅读全文
posted @ 2025-09-12 08:17
FormulaOne
阅读(14)
评论(0)
推荐(0)
摘要:
[SNCPC2019] Unrooted Trie 发现不满足题意的情况就是一个节点到多个子节点的边的字母相同,那么合法当且仅当每个节点到子节点的字母互不相同。那么可以统计每个节点连接的字母数量,并运用类似换根 dp 的思路,快速更新这个数量并实时维护符合条件的点的数量即可。时间复杂度 \(O(26 阅读全文
posted @ 2025-09-12 08:17
FormulaOne
阅读(20)
评论(0)
推荐(0)
摘要:
考虑 dp。设 \(f_i\) 表示恰好有 \(i\) 种染色方案所需的最少点数,根据乘法原理,若 \(i \mid j\),则 \(f_j \leftarrow \min f_{\frac{j}{i}}+ f_{i-2}\)(由于是由两棵数合并为一棵树,故其中的一个树根不再要求为绿色,可以变为黄色 阅读全文
posted @ 2025-09-12 08:16
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
注意到一条边无论方向如何,都能使两端的某一个点到达另一个点,即至少有 \(n-1\) 对。如果只需要 \(n-1\) 对,那么只需要在每一条链上相邻的边方向相反即可。对于剩下的一对,我们可以找到一个度数为 \(2\) 的点,并把连接的两条边由反向改为同向,那么附近的三个点产生的对数由 \(2\) 变 阅读全文
posted @ 2025-09-12 08:16
FormulaOne
阅读(8)
评论(0)
推荐(0)
摘要:
设 Alice 取的位置为 \(i,j,k\) 且 \(i<j<k\),则 Bob 的最优策略有两种:取 \(n\) 或 \(k\)。为了使 Alice 必胜,必须同时满足 \(a_i+a_j+a_k>a_n,a_i+a_j>a_k\)。枚举 \(i,j\),显然满足两个条件的 \(k\) 都是一段 阅读全文
posted @ 2025-09-12 08:15
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
显然,每一层恰好能放下两个球(事实上这也是最优的方案),那么下面一共可以放 \(\lfloor \frac{h}{r} \rfloor \times 2\) 个球,剩余 \(h - \lfloor \frac{h}{r} \rfloor \times r+r\) 的高度,记 \(h'=h-\lflo 阅读全文
posted @ 2025-09-12 08:15
FormulaOne
阅读(22)
评论(0)
推荐(0)
摘要:
先枚举矩形左上角坐标 \((x_1,y_1)\),以及右下角横坐标 \(x_2\),则可得右下角纵坐标 \(y_2\in [y_1,m]\)。显然,随着 \(y_2\) 的增大,矩形内符合图形的数量只增不减,故可以二分出第一个位置使得该数量恰好为 \(k\)。计算矩阵内符合图形的数量使用二位前缀和。 阅读全文
posted @ 2025-09-12 08:15
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
注意到横着的障碍如果左端点不是 \(1\) 那么是一定不用拆的(要么把挡在它下面的左端点是 \(1\) 的障碍直接拆掉,要么拆掉若干个竖的障碍然后把左端点是 \(1\) 的障碍绕掉,反正拆了也没用,左端点是 \(1\) 的还会挡着)。那么对竖的障碍和有效的横的障碍分别按横坐标排序后,考虑二分答案,判 阅读全文
posted @ 2025-09-12 08:14
FormulaOne
阅读(13)
评论(0)
推荐(0)
摘要:
2025-6-23 446B \(2000\),绿。贪心,优先队列。 直接行或列取最大值是错的。注意到最终的总答案与操作的顺序无关(操作的顺序就是先减后减的问题)。因此我们不妨先执行所有行操作再执行所有列操作。设执行行操作 \(i\) 次,列操作 \(k-i\) 次,则一共产生 \(i\times( 阅读全文
posted @ 2025-09-12 08:14
FormulaOne
阅读(34)
评论(0)
推荐(0)
摘要:
首先可以把所有操作的类型及时间记录下来,分类存进 map 里。 根据贪心,显然越靠前的字母越小越好。从前往后考虑每位 \(s_i\): \(s_i=a\) 已经最优了,无需处理。 \(s_i=b\) 优先考虑 \(b \rightarrow a\),如果不存在这样的操作就考虑 \(b \righta 阅读全文
posted @ 2025-09-12 08:13
FormulaOne
阅读(5)
评论(0)
推荐(0)
摘要:
发现 \(a_i\) 的最后两位对答案没有任何影响,因此我们只需考虑 \(a_i\) 所在楼层。按照所在楼层从低到高对 \(a\) 排序。 记 \(b_i=\lfloor \frac{a_i}{100} \rfloor\)对于每两节课之间,我们要选 \(x_1,x_2,\cdots,x_n\) 和 阅读全文
posted @ 2025-09-12 08:12
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
显然,操作的方式一定是一段数字相等的极长连续段向左右拓展(包括长度为 \(1\) 的段)。故只需扫一遍并维护每段的值和长度即可,并更新答案。时间复杂度 \(O(\sum n)\)。 #include<iostream> #include<cstdio> #define int long long # 阅读全文
posted @ 2025-09-12 08:12
FormulaOne
阅读(10)
评论(0)
推荐(0)
摘要:
首先最大的 \(f_n\) 必须放的下,即 \(f_n \le \min(w,l,h)\)。此外,\(f_{n-1}\) 紧贴在 \(f_n\) 的一个面上,故要 \(f_n+f_{n-1} \le \max(w,l,h)\)。剩下的第 \(i\) 个正方体由于满足 \(f_{i+2}=f_{i}+ 阅读全文
posted @ 2025-09-12 08:11
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
设 \(f_u\) 表示以 \(u\) 为根的子树构成不同多叉堆的方案数。显然最小的 \(0\) 应该分配给 \(u\),剩下的分给子节点 \(v_1,v_2,\cdots,v_k\),根据乘法原理,有 \[f_u=\prod_{i=1}^k \binom{siz_u-1-\sum_{j=1}^{i 阅读全文
posted @ 2025-09-12 08:11
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
2025.6.18 NOIP2024 T4 树上查询 To be updated. Submission CSP-S2019 江西 T3 网格图 To be updated. Submission 2025.6.19 CSP-S2019 D1T2 括号树 To be updated. Submiss 阅读全文
posted @ 2025-09-12 08:10
FormulaOne
阅读(25)
评论(0)
推荐(0)
摘要:
观察数据范围,考虑枚举每个区间 \([l,r]\),使用前缀和快速求出区间和并判断是否为完全平方数,若是则对 \(i \in [l,r]\) 都产生 \(1\) 的贡献,使用差分数组维护即可。时间复杂度 \(O(n^2)\)。 #include <iostream> #include <cstdio 阅读全文
posted @ 2025-09-12 08:09
FormulaOne
阅读(11)
评论(0)
推荐(0)
摘要:
注意到点的权值是从叶子往根节点 \(1\) 传递的,一个点的点权向父节点传递后,会从子节点中选一个最小的权值。由此,我们可以使用优先队列维护当前 \(1\) 周围的权值。当点 \(u\) 的权值最小时,把 \(u\) 的所有子节点 \(v\) 加入优先队列,这样能保证 \(u\) 的权值能够更新为子 阅读全文
posted @ 2025-09-12 08:09
FormulaOne
阅读(15)
评论(0)
推荐(0)
摘要:
首先对于 \(0,1,2\) 可以放的位置有如下事实: \(0\) 可以放任何位置。因为没有数比 \(0\) 小。 \(1\) 必须一侧是 \(0\),另一侧是 \(1\) 或 \(2\)。具体地,只有 \(0,1,2\) 或 \(0,1,1,0\) 两种情形。 \(2\) 不能连续放置。不连续放置 阅读全文
posted @ 2025-09-12 08:09
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
由于相邻两个正整数 \(n,n+1\)(\(1\) 除外)用后者除以前者得到的余数一定为 \(1\),故 \(S\) 中不存在两个相邻的正整数。又 \(1\) 除以任何其它正整数的余数都为 \(1\),故 \(1 \notin S\)。一个简单的构造方法是把所有不超过 \(n\) 的偶数放入 \(S 阅读全文
posted @ 2025-09-12 08:08
FormulaOne
阅读(12)
评论(0)
推荐(0)
摘要:
应该是最好想的做法了。 注意到对于任意非负整数 \(k\),\(2k\) 和 \(2k+1\) 两个数的二进制下 \(1\) 的出现次数必定一奇一偶,即贡献和为 \(1\)。为什么?因为一个偶数的二进制最后一位一定是 \(0\),比它大 \(1\) 的奇数一定是最后一位变成 \(1\)(一定不会进位 阅读全文
posted @ 2025-09-12 08:08
FormulaOne
阅读(7)
评论(0)
推荐(0)
摘要:
观察到一个数 \(x\) 是否删除取决于 \(x+d\) 和 \(x-d\) 是否删除。考虑 dp,设 \(f_{i,0/1}\) 表示当前为数字 \(i\) 的最少删除次数,其中 \(0\) 表示删除 \(i\),\(1\) 表示不删除,则应当由 \(f_{i-d,0/1}\) 转移过来。具体地, 阅读全文
posted @ 2025-09-12 08:07
FormulaOne
阅读(6)
评论(0)
推荐(0)
摘要:
首先考虑如何求出原串中 JOI 的出现次数。不难想到以 O 为中心,将左边 J 与右边 I 的数量相乘再累加起来即可。同样,我们可以运用类似的思路分析插入的字母对答案的影响。当插入 J 时,增加的贡献即为每个 O 后面 I 的出现次数的和(注意是每个),此时显然在最前面插入最优。同理,插入 I 时, 阅读全文
posted @ 2025-09-12 08:07
FormulaOne
阅读(5)
评论(0)
推荐(0)
摘要:
注意到 \(N \times M \le 2\times 10^7\),因此不难得到一个 dp 做法。设 \(f_i\) 表示把前 \(i\) 个橙子装进箱子内的最小成本,则不难得到以下转移式: \[f_i=\min_{i-j\le m,0 \le j < i} f_j+k+ ( i - j ) \ 阅读全文
posted @ 2025-09-12 08:07
FormulaOne
阅读(9)
评论(0)
推荐(0)
摘要:
题目要求最小化爬楼梯的次数,那么我们就要让楼层的变化尽量小,即沿线楼房高度越高越好。不难发现影响答案的是路线中的楼房高度的最小值,则需要最大化最小值。那么就不难用 Kruskal 重构树做了。对每个点进行唯一编号,相邻的点建边权为较小的的楼房高度的双向边。剩下的就是 Kruskal 的模板了。最后求 阅读全文
posted @ 2025-09-12 08:06
FormulaOne
阅读(20)
评论(0)
推荐(0)
摘要:
在同一棵树中,选择任意一个点作为根,效果都是相同的。不妨以 \(1\) 为树根,考虑树上 dp,记 \(f_u\) 为以 \(u\) 为根的子树的点数最大值。注意到根节点度数可为 \(1\) 可为 \(4\),而非根非叶子节点度数必须为 \(4\)。由此可以分两类转移。 假设子树中 \(u\) 度数 阅读全文
posted @ 2025-09-12 08:06
FormulaOne
阅读(14)
评论(0)
推荐(0)

浙公网安备 33010602011771号