01 2024 档案
摘要:最近正在练构造题,写篇题解分享一下实现的细节。 核心过程 大胆猜测,不难发现一个重要的结论:假设有一个式子 \(a+a-0\),则其从左往右的结果为 \(2a\),从右往左的结果为 \(0\)。有了这个结论,我们就可以考虑用两段这样的式子来分别求得 \(p\) 和 \(q\)。接下来分析细节。 上述
阅读全文
摘要:看完题目后,发现直接对 \(a\) 模拟操作的情况过多,不好处理。但如果对 \(n\) 进行逆向操作,似乎可以在很少步数内就变为 \(1\)。我们大胆猜想,用最少的步数使 \(n\) 变为 \(1\),再考虑如何处理多余的次数(若次数不足则直接无解)。先列出转换后的操作: \(n\gets n +
阅读全文
摘要:蒟蒻太菜了,看不懂图论的做法,就只好找规律了。 分析题目,可以得到一些信息:\(n\) 个不同的数最多能组成 \(\dfrac{n(n-1)}{2}\) 个不相同的无序二元组,而一个 $n \times n $ 的下三角形同行相邻的数对数量为 \(\dfrac{n(n-1)}{2}\),因此可以确定
阅读全文
摘要:不难想到,求区间和可以先 \(O(n)\) 预处理前缀和,后面就能做到对于区间 \([l,r]\) 可以 \(O(1)\) 求出 \(\sum_{i=l}^r a_i\)。接下来考虑如何求解答案。 设预处理后的前缀和数组 \(sum_i=\sum_{j=1}^i a_j\)。 区间 \([l,r]\
阅读全文
摘要:Update on 2023.8.17:修正了一处小错误。 分析题目可知,答案至少为 \(\sum_{i=1}^{n} a_i\)。接下来考虑怎样使答案更大。 可以对 \(n\) 分成如下几类情况讨论: \(n=2\) 这种情况十分简单,如果选择操作最多一次,否则两次就会变为 \(0\)。用 $ \
阅读全文
摘要:考虑将 \(1\) 号点定为树根,然后通过搜索确定结点之间的父子关系。对于每次操作,先判断该边两端的点的父子关系,然后再分类讨论进行操作。 如何维护每个点的点权呢?注意到,修改有很多次,但查询只在最后有一次,因此可以考虑树上差分。具体地,设 \(a_i\) 表示 \(i\) 的点权,\(f_i\)
阅读全文
摘要:不难想到,可以枚举每个 \(a_i\) 的倍数,并用一个数组统计出现次数,最后求最大值,理论时间复杂度 \(O(n \log n)\)。但如果 \(a_i\) 较小且重复出现,可能退化到 \(O(n^2)\)。因此可以做一个小优化:对于每个 \(a_i \le n\),提前统计出每个数出现的次数,枚
阅读全文
摘要:根据题意,不难想到贪心,将 \(a\) 从小到大排序,使得相邻两数之差的绝对值尽可能小。若存在两数之差的绝对值大于 \(k\),则将两数之间作为一个“分界线”。在确定所有“分界线”后,序列被分成了多个子段,这些子段中最多保留一个才能满足条件。根据贪心,选择保留最长的一段,用 \(n\) 减去其长度即
阅读全文
摘要:要找到这个单词,就要先找到这个单词的开头,在输入时即可判断。根据题意,保持列数不变,增加行数,直到不为字母,输出途经的字母即构成了单词。 #include <bits/stdc++.h> #define int long long using namespace std; char a[9][9];
阅读全文
摘要:签到题,按照题意模拟即可。遍历整个数组,当 $a_i \le 10 $ 时,用 \(b_i\) 更新最大值即可。 #include <bits/stdc++.h> #define int long long using namespace std; signed main() { int T,n,a
阅读全文
摘要:看到本题,很容易想到贪心,对每一段相同的子串计算最小代价。但这种思路的评测结果显示有 \(3\) 个测试点 WA 了,因此解法错误。既然贪心行不通,我们不妨使用 dp,对每一位进行分类讨论并求最小耗时。 设 \(dp_{i,j}\) 表示 Capslock 状态为 \(j\) 时(\(j\) 为 \
阅读全文
摘要:由题意可知,猫猫至少需要进行 \(n\) 的数位和次操作。注意到一个关键信息,当有前导 \(0\) 时猫猫会立刻拿走该雪糕棒,因此此时不能修改其数值。所以结论也就出来了:当 \(n\) 中存在 \(0\) 时,答案为 \(n\) 的数位和加 \(9\),否则当任意一位修改为 \(1\) 时,修改其为
阅读全文
摘要:分析题意可知, \(a_i\) 始终为正数。将 \(a\) 从小到大排序后,\(a_1\) 无法做任何修改,所以 \(a\) 的奇偶性与 \(a_1\) 的奇偶性相同。对 \(a_1\) 的奇偶性进行分类讨论: \(a_1\) 为奇数 对于每个 \(a_i\),若 \(a_i\) 为奇数,则不做任何
阅读全文
摘要:由于题目保证有解,因此可以保证一定不超过 \(k\),可以忽略这个条件。要使得 $ |a_i - b_i| $ 最小,很容易想到贪心做法,将 \(a\) 和 \(b\) 分别排序,将位置相同的两个作为一对计算答案。显然这种做法能保证答案最小,证明过程不详解。 代码如下: #include <iost
阅读全文
摘要:题意 给定一个有 \(n\) 个点的无向图。初始没有任何边。 接下来有 \(q\) 次操作,分为 \(2\) 种类型: 1 u v:连接 \(u\) 和 \(v\),保证没有重边、自环。 2 v:删除连接 \(v\) 的所有边。 每次操作后,输出没有连接其它任何点的点的数量(即度数为 \(0\) 的
阅读全文
摘要:题意 一个人要送礼物给另外两个人,现有 \(n\) 件礼物要选一件送给第一个人,价值分别为 \(a_1,a_2,\cdots,a_n\),有 \(m\) 件礼物要选一件送给第二个人,价值分别为 \(b_1,b_2,\cdots,b_m\)。求在两件礼物之差不超过 \(d\) 的情况下,价值总和的最大
阅读全文
摘要:题意 有 \(n\) 个字符串,它们的长度都为 \(m\)。问能否通过改变它们的顺序,使得后一个字符串能由前一个字符串只改变一个字母而得到? 思路 本题数据范围 $ 2 \le N \le 8 $,非常小,因此可以考虑全排列枚举所有的情况,最后检验是否存在符合要求的顺序即可。 代码如下: #incl
阅读全文
摘要:很显然,满足条件的子段的异或和均为 \(0\)(因为每个数都出现了偶数次,而两个相同的数的异或值为 \(0\))。问题转化为求异或和为 \(0\) 的子段的个数。 不难想到,可以从前往后扫一遍,并且计算异或和,可以得出起点为 \(1\) 且满足条件的子段。那么如何计算中间的子段数量?有如下可行的方案
阅读全文
摘要:题意 \(n\) 个袜子,每个袜子有一个颜色,如果有两个袜子的颜色相同,则可以把它们配成一对袜子。求一共能配成多少对袜子。 思路 看到颜色值域 \(1 \le a_i \le 10^9\),用普通的数组存不下。可以考虑对序列 \(a\) 排序,求出相同颜色袜子的数量 \(k\),则可以产生 \(\l
阅读全文
摘要:题意 有 \(n\) 个人在银行里排队等待工作人员叫号。接下来有 \(q\) 个事件,事件的类型分为 \(3\) 种。 1 工作人员叫一个当前未被叫号的人过来。 2 x 代表编号为 \(x\) 的人来了(保证 \(x\) 至少被叫号一次)。 3 重复呼叫没有来的人当中编号最小的,并要求输出其编号。
阅读全文
摘要:题意 给定长度为 \(n\) 的序列 \(a\) 和长度为 \(m\) 的序列 \(b\),序列 \(c\) 为这两个序列连在一起组成的。求 \(a\) 和 \(b\) 中的每个元素在 \(c\) 中分别是第几小。 思路 STL 的练手题。输入时将 \(a\) 和 \(b\) 中的元素存入 \(c\
阅读全文
摘要:看到 $ n \le 10^5$,就知道这题不是纯模拟。 又看到了 $ 0 \le d < 2^{16}$,发现特殊的地方,于是就考虑使用二进制。 具体地,我们对两种操作分类讨论(题目中的字符打不出来,用 \(l\) 代替)。 操作一 在二进制下,将二进制数左移一位相当于将原数乘 \(2\)。不过由
阅读全文
摘要:很显然地,除了 \(3^0\) 只能选一次外,每个 \(3\) 的幂最多可以用两次。于是我们可以类比二进制拆分的思路,依次枚举 \(3\) 的幂,每次找到小于当前数的最大的幂并减去,统计次数,发现非 \(0\) 次幂出现次数大于 \(2\) 或 \(0\) 次幂大于 \(1\) 时则输出 \(0\)
阅读全文
摘要:https://www.luogu.com.cn/problem/AT_abc179_e https://www.luogu.com.cn/discuss/576745
阅读全文
摘要:贪心思想,STR 值增长得越慢,可能得到的 EXP 值就越多。 根据此,我们在 \(x\) 较小时,可以乘 \(a\) 也可以加 \(b\),选择运算后较小的一种情况。在某一时刻,当 \(x \times a > x + b\) 时,可知一直到最后都应选择加 \(b\)(前者是几何级增长,后者是算术
阅读全文
摘要:这题是个分类讨论题。 要使得没有人连续两次提议,关键在于最大值和次大值。 因此分三类情况。 记最大值为 \(a\),出现次数 \(cnta\),次大值 \(b\),出现次数 \(cntb\)。 \(cnta \ge 2\) 最大值不止一个,说明有多个人会同时在第 \(a\) 轮结束,因此无论任何情况
阅读全文
摘要:题意 定义 \(f(x,m)= x \bmod m\)。 有一个序列 \(a\),满足 \(a_1=1\),\(a_i=f(a_{i-1}^2,m)\)。 求 \[\sum_{i=1}^na_i \]思路 这道题 \(n\) 的数据范围很大,但 \(m\) 最多只有 \(10^5\),因此考虑以此为
阅读全文
摘要:题意 给定 \(n\) 和 \(k\) 个区间,并且保证 $ k \le 10$ 且互不相交。可以进行任意次操作,每次可以选择一个整数 \(j\),\(j\) 要满足在其中一个给定的区间上,从当前位置向右移动 \(j\) 的距离。求 \(1\) 到 \(n\) 的方案数。 思路 提供一种数据结构的做
阅读全文
摘要:看到这题,第一反应是用线段树。但本题数据 \(1 \le a_i \le b_i \le 10^9\),时间、空间复杂度均无法接受,于是改变思考方向。 维护区间修改的另一种方法是差分。但是由于区间长度很长,就不能对整个差分数组进行计算。取而代之的有一种方法,即将所有的有差分值的点记录下来,按其时间先
阅读全文
摘要:一道简单的签到题。 按照题意模拟即可。循环输入,对其进行分类讨论,最后输出即可。实现上有一些细节,具体见代码。 #include <iostream> #include <cstdio> using namespace std; string s,t; int a,b; int main() { w
阅读全文
摘要:一道简单的签到题。 每两个栅栏之间就相当于构成了一个梯形,两边的栅栏分别为上底和下底,木板的宽度为高,因此按照梯形的面积计算公式计算每块木板的面积,再计算总和即可。 代码如下: #include <iostream> #include <cstdio> using namespace std; in
阅读全文
摘要:题意 给定 \(n,m,p\),求 \[\sum_{i=1}^n \sum_{j=1}^m (i \times j \bmod p) \]分析 看到 \(1 \le n,m \le 10^{12}\),知道 \(O(nm)\) 的暴力算法行不通。但 \(1 \le p \le 10^3\),范围很小
阅读全文
摘要:题意 给定一个长度为 \(n\) 的序列 \(a\),下标从 \(1\) 开始,\(m\) 次操作,每次操作给定 \(x\) 和 \(y\),将所有满足 \(i \oplus x = 0\) 的 \(a_i\) 减 \(y\),\(m\) 次操作后输出序列 \(a\)。 思路 要使得 \(i \op
阅读全文
摘要:before \(\text{inf}\) days 据说今年 GD 参赛的人数特别多,很慌。 8.01 按照往年的惯例,又是一年集训时。 去年没学好,只好重头开始。 今年这一届的队友 tql。 算是基本上把深进给复习了一遍吧。 8.22 集训终于结束了。 烦人的初赛又来了。 CSP 模拟套题接连不
阅读全文
摘要:题意 \(T\) 组数据,每组数据给定一个长度为 \(n\) 的序列 \(s\)。求出每个数与最大值的差(最大值本身除外),以及最大值和次大值的差(最大值的位置),按照原来的顺序输出。 做法 模拟题,十分简单,只需对原序列求最大值和次大值即可,然后再按位置输出。 Code 具体实现细节见代码。 #i
阅读全文
摘要:题意 \(T\) 组数据,每次给定一个只含小写字母的字符串,求要拼出这个句子至少需要长度为多少的字母表。定义长度为 \(x\) 的字母表含有 \(26\) 字母表上的前 \(x\) 个字母。 做法 转化一下题目,很容易发现题目本质上就是要求字符串中最大的字母在 \(26\) 字母表中的位置。其它不是
阅读全文
摘要:题意 \(T\) 组数据,每组数据给 \(3\) 个数,要求选出既不是最大值也不是最小值的那个数。 做法 这题由于十分简单,因此各种做法均可通过。最朴素的做法为比较出最大值和最小值,然后对三个数依次判断,找出符合条件的那个数即可。 Code #include <iostream> #include
阅读全文
摘要:题目传送门 分析 既然要使得购买到商品的人最多,很容易想到要用贪心的策略。对于拥有的钱越少的人,就应当给 ta 匹配越便宜的商品。可以证明这种方案能使人数最大化。 接下来看具体的方法。首先将 \(w_i\) 和 \(c_i\) 从小到大排序(\(w_i\) 和 \(c_i\) 的含义如题目中所述),
阅读全文
摘要:题目传送门 貌似各路神仙都用线段树、平衡树秒了这题,蒟蒻在此献上一篇暴力的题解。 分析 看到数据范围 $ 1 \le n,q \le 2 \times 10^5$,而且还要求区间最大乘积 \(M\),很容易想到用线段树。但当我们看完题目,看到当 \(M\) 大于 \(2^{30}\) 时直接输出一个
阅读全文
摘要:题意 这题花了我好长时间才看明白。 一道二分查找题。每次查找一个数 \(t\)(保证一定能找到),每次 \(\operatorname{mid}\) 可以取 \(\left\lfloor\dfrac{(l+r)}{2}\right\rfloor\) 或 \(\left\lfloor\dfrac{(l
阅读全文
摘要:这题各个神仙都用了 \(O(n)\) 的算法,只有我用了 \(O(2^n)\) 的暴搜。 分析 既然要使极差最大,很容易想到要使最大数尽可能大,最小数尽可能地小。那么每一次操作就有两种选择:处理最大数或最小数。在本题中操作次数 \(m \le 10\),因此可以每次分两种情况,并分别搜索下去。对于每
阅读全文
摘要:题意 构造一个 \(n\) 的排列 \(p\),使得 $ \sum\limits_{i=1}^n \operatorname{lcm}(i,p_i)$ 最大。 分析 首先要知道,\(\operatorname{lcm}\) 是求两数的最小公倍数。因此,我们把思考方向引向公约数与公倍数。先回顾一下这条
阅读全文
摘要:看完题目,很容易得知要使 $ \sum\limits_{i=1}^k p_i$ 最小,且 \(p_i\) 是 \(n\) 的一个排列,可以知道最终的答案为 \(\sum\limits_{i=1}^k i\)。现在我们考虑如何将原序列转化成答案序列。 得知答案后,我们要做的就是将所有的 \(p_i \
阅读全文
摘要:题意 给定 \(n\) 颗依次飞来的导弹的高度,现在有一个拦截系统,它的特点是:第一次拦截的导弹可以任意高度,但以后任何一次都不能高于上一次。现在要求这套系统最多能拦截多少颗导弹,以及要拦截所有导弹最少需要多少套这样的系统。 分析 题目要求两个不同的问题的答案,我们可以分开处理。 求最多能拦截多少颗
阅读全文
摘要:题意为找出最短的无序子序列。这题看到 \(k\) 的取值有多种可能,我们不妨对其取值作分类讨论。 \(k=1\) 或 \(k=2\) 很显然,当 \(k=1\) 时,只有一个数,不满足题意;当 \(k=2\) 时,两个数之间一定是递增或递降的,也不符合要求。 \(k=3\) 当 \(k=3\) 时,
阅读全文
摘要:这题要求用不超过 \(n\) 次的交换将 \(n\) 个整数从小到大排序。很显然,在最坏的情况下,为了满足条件,我们需要使每个数一步到位,即只与要到达的那个位置上的的数交换一次。 那么我们很容易想到用选择排序了。先回顾一下选择排序,核心代码如下: for(int i=1;i<n;i++) for(i
阅读全文
摘要:题意 \(n\) 次操作,每次在矩形地面上选择一个格子 \((x_i,y_i)\),在上面加上 \(z_i\) 个方块。一个立体图形的「侧面积」定义为所有方块的前后左右面不紧贴着另一个方块,则该面计入「侧面积」。求每次操作后立体图形的侧面积。 分析 最直接的想法就是每加入 \(z_i\) 个方块后,
阅读全文
摘要:题意 已知一个长度为 \(n\) 的序列 \(a\),要构造一个长度为 \(n\) 的序列 \(b\),使得对于 \(1 \le i \le n\),都有 \(b_i \le a_i\),且使 \(\gcd(b_1,b_2,\cdots,b_n)\) 最大,并求出不同的方案数。 分析 既然要使 \(
阅读全文
摘要:这题一看到 \(1 \le T \le 10^5\),\(1 \le n \le 10^{11}\),就知道暴力是肯定不行的了。但是看到题目限制“因子个数为奇数”,发现是一个突破口。 众所周知,一个正整数 \(n\) 的因子总是成对出现的。举个例子,若有正整数 \(a\) 和 \(b\) 满足 \(
阅读全文
摘要:题意 给定整数 \(s,m\),,判断能否构造一个长度为 \(n\)(\(n\) 值自定)的数列 \(a\),满足: \(1 \le n \le m\)。 \(1 \le a_i \le s\)。 设 \(S(a)\) 表示 \(a\) 中所有元素的异或和,则\(S(a)=0\)。 \(a_1+a_
阅读全文
摘要:题意(化简后):有一个长度为 \(5\) 的序列 \(a\),现给定 \(a_1\),\(a_2\),\(a_3\),\(a_4\),你需要判断是否存在 \(a_5\),使得在每个数只出现一次的情况下,有三个数为连续的正整数,且另外两个数相等。 看到题目,为了方便判断是否相邻,我们先对序列 \(a\
阅读全文
摘要:题意十分简单:找出你的手牌中是否有炸弹(有炸弹定义为有大小王各一张或有四张数码相同的牌)。 这题因为手牌已经有序,且牌的种类很少,所以直接依次判断是否存在王炸或者四个连续的数码即可。 代码见下: #include <iostream> #include <cstdio> using namespac
阅读全文
摘要:这题一看到要判断 \(a \times b = c\) 是否成立,立马想到了用 FFT/NTT。 但看到数据范围 \(a,b \le 10^n\),\(c \le 10^{2n}\),\(n \le 1 \times 10^6 + 50\),再加上时限很紧(\(1\) 秒),因此 \(O(Tn \l
阅读全文
摘要:题目要求了 \(z\) 为奇素数,而为了进行更多次的有效操作,很容易想到直接让 \(z=3\)。这样做,对于原题中 \(1 \le n \le 10^{18}\),最大的 \(\sqrt[3]{n}\) 不会超过 \(10^6\),完全可以在 \(O(n)\) 的时间复杂度内解决。 于是思路便产生了
阅读全文
摘要:这道题的难度不错,出题人很良心。相信大家都能看出来是贪心。题意就不用说了。 可能有人会认为是背包,但题目要的是物品越多越好,而不是价值越大越好,所以优先选择价格小的物品,这就是贪心思想了。 这题的思路也十分简单。首先将所有的 \(a_i\) 从小到大排序,找出不超过 \(w\) 的最大的 \(a_i
阅读全文
摘要:JROI 果然很良心,签到题终于可以用来签到了。 这道题一看数据范围 $1 \le l \le r \le 10^{18} $,就能知道肯定是数学题。遇到数学题不用急,我们一步步分析。 回忆小学学习的关于互质的一条性质:相邻的两个正整数互质。形式化地说,若 \(a\) 和 \(b\) 为两个相邻的正
阅读全文
摘要:这题十分简单,化简一下题意为:一次操作定义为对一个数乘 \(\frac{1}{2}\),\(\frac{1}{3}\) 或 \(\frac{1}{5}\),求使用最少的操作次数,使得两个数 \(a\) 和 \(b\) 相等。 不难发现,每一次都是倍数变换,所以最终的 \(a\) 和 \(b\) 是
阅读全文
摘要:这道题的题意十分简单:求从 \(k\) 出发到每个点的最长路。 看到最长路这个词,可能一时半会儿没有思路,因为我们平时学习的都是最短路算法。回忆小学学过的一句话“一个负数的绝对值越大,那么它本身的值就越小”,这提示我们将求最长路设法转化为求最短路。 于是便很容易得出转化思路:先对每条边的长度取相反数
阅读全文
摘要:题目的大意是求所有点对之间最短路之和的平均值。要求所有点对之间的最短路(即全源最短路),并且数据范围很小。很容易想到使用 Floyd 算法。 Floyd 的实现(会用的可以跳过) Floyd 本质上是一种动态规划。设 \(d_{i,j}\) 表示从 \(i\) 到 \(j\) 的最短路径的长度(注意
阅读全文
摘要:根据题意,首先可以一眼看出一个重要的规律: 对于任意的正整数 \(n\),都有 \[d(n)>n \]根据这个规律,我们很容易得知一个性质,当枚举到一个数 \(k\) 时,如果已经枚举过的数 \(i(i<k)\) 没有一个能满足 \(d(i)=k\),那么 \(k\) 是“Self-Number”。
阅读全文
摘要:根据题意,很容易得知要使得它们的最大值最小,就要从最小的 \(1\) 开始用。转化一下题意,不难发现,我们只需求出最小的 \(k\),使得 \[\ \sum_{i=1}^k i\ \ge n \]于是思路便产生了:对 \(1\),\(2\),\(3\),⋯\(k\) 求和,直到上述式子成立。可以很容
阅读全文
摘要:根据题意,可以很容易地发现,题目所要求的数都可以用形如 $ p^x$ 的式子表示(其中 $ p $ 为质数, \(x \ge 2\)),即分解成只含同一个质因子的式子。这提示我们使用构造的思想。 因为 \(n\) 最大为 $ 10 ^ {12}$,所以最大的 \(\sqrt n\) 也不会超过 \(
阅读全文
摘要:NOIP2021来啦! Day0 为了方便,我们提前一天便到了考点附近。出发之前,我们又在机房里呆了两 个小时,大家都在忙着复习着诸如线段树等模板。两个小时的车程后,我们吃过饭,老师又把我们集中开会,跟我们讲了一堆注意事项。讲完之后,大家都睡了。 Day1 第一次打联赛,不免有些小紧张,毕竟这些题目
阅读全文
摘要:基本定义:只含有一个未知数,且未知数的次数为 \(2\) 的等式。 首先回顾一元一次方程,例如 \[x+2=6 \]移项得 \[x=4 \]那么,我们将 \(x\) 扩大到 \(x^2\),变成如下式子 \[x^2+2=6 \]移项得 \[x^2=4 \]开方得 \[x= \pm 2 \]是不是很简
阅读全文
摘要:Update on 2022.11.12:修正了一处小错误 希望这份东西能尽量帮助大家,节省在 \(\LaTeX\) 公式大全中寻找的时间,欢迎在评论区提出建议。 如果您有需求,例如添加某一部分的公式,可私信号主。 插入公式 $你要插入的公式$ 这是普通插入(即紧跟随文字插入) $$你要插入的公式(
阅读全文