- 博客(42)
- 收藏
- 关注
原创 [ARC105E] Keep Graph Disconnected题解
考虑加任意一条边时都会输的图的状态:图被分成两个强联通分量,每一个强联通分量都是一个完全图。也就是说,假设一开始节点1和节点n不联通,那么还可以加2nn−1−m−cnt1n−cnt1次,其中cntx代表x所在联通块大小。
2024-07-30 10:08:20
381
原创 迭代加深搜索(IDDFS)和启发式迭代加深搜索(IDA*))
假设现在有一个任务,这个任务要通过深度优先搜索(DFS)完成,并且搜索深度可能很深,比如20层。但是答案一般在5层。怎么设计搜索可以尽快完成任务?
2024-04-25 16:46:06
700
原创 P6348 [PA2011] Journeys 题解
此题要用线段树优化建图写,这里顺便讲解一下线段树优化建图。如果我们要从一张图的一个节点向另外k个节点连边:那么如果我们要执行2⋅105次这样的操作,每一次都要连105条边,阁下又将如何应对?如果我们在线段树上连边:这样就只用连logN条边。如果我们要从一个区间向一个点连边呢?多建一棵树,要进行最短路操作就从另外一棵树开始(我们称之为出树,另外一棵为入树)。这样就成功地从34节点向1节点连了一条边。如果要区间向区间连边,就多建一个虚点,就可以了。
2024-03-24 16:55:14
722
原创 AtCoder Better 和 Codeforces Better 安装方式
使用方法:可以翻译 AtCoder 和 CodeForces 里面的题目和题解,点击段落右上角的翻译按钮(三个按钮中最右边的一个)即可将内容翻译到下面。,搜索 AtCoder Better,点进第一个,安装,在弹出的界面中选择安装,就可以了。Codeforces Better 同理。扩展->管理扩展->搜寻找更多附加组件->搜索Tampermonkey,点进第一个,添加到 FireFox,剩下步骤同 Edge。首先,扩展->管理扩展->获取 Microsoft Edge 扩展,搜索篡改猴,获取,安装它。
2024-03-17 15:18:37
3292
4
原创 ABC345 A-D 题解
所以在 DFS 中,我们对于每一个未被放置的矩形,直接讨论左上角第一个未被放置的位置就行了。个字符是否是等号,如果全部是,说明这个字符串是符合条件的,否则,不符合条件。的情况:为了方便讨论,我们可以让这个字符和前面的字符交换,一共可以和两个。交换,因为这样交换后和之前是一样的,我们先不讨论这种情况。最后,我们还要讨论交换后和以前相等的情况:如果有一个字符。位置必须被放置,那么我们放置下一个方块时,可以直接讨论。告诉我们,交换后的字串可以和交换前的字串相等。的情况:这个时候要被交换的一个字符是。
2024-03-17 13:41:44
1031
原创 说说斐波那契数列
F斐波那契数列是一个非常神奇的数列:它有很多的性质。在后文中,我们用fn表示第一项和第二项都为1的斐波那契数列,Fn表示第一项和第二项为任意正整数的斐波那契数列。
2024-03-07 16:15:17
952
原创 ABC343A-E题解
然后如果有两个立方体并不相交,那么两个立方体的相对位置对答案没有影响。把取出来的每一位的数放在数组里,再用一个数组反着存每一位,如果两个数组相等,说明。等于一个常数,那么输出这个常数加上一,否则,输出这个常数。,然后当一个人的分数发生改变时,设这个人之前的分数为。的个数变成了一,说明多了一种分数,分数种类数加一。,说明少了一种分数,分数种类数减少一,如果改变后。数组存储每一个分数的个数,一开始分数为。,就再次随机一次,否则,就输出这个数。我们存下每一个人的分数,再用一个。所以对于剩下两个立方体的坐标,从。
2024-03-02 23:53:02
984
原创 ABC342A-E题解
我们得到在时间限制下每一条路线最后一班车的时间,再跑一遍迪杰斯特拉算法,终点的时间为无穷大,然后让每一个点到达的时间尽量大,去找下一条边时,要乘坐时间不能超过当前时间的列车。根据上一个定理,我们可以推导出:如果一个完全平方数除以另一个完全平方数,如果结果是整数,那么结果也是一个完全平方数。对于一个完全平方数,我们将其分解质因数,每一个质因数的个数一定是偶数,这个不难理解。,那么结果一定是一个完全平方数,这个定理可以根据上面说的推导出来。对于每一个寻问,找到这两个数的位置,输出值较小的那个数的坐标,完事。
2024-02-25 13:03:09
864
原创 CF1926D 题解
我们发现,一个组里面要么只有一个整数,要么只有两个整数。因为如果一个组里面有三个整数,其中第一个和第二个满足条件,第一个和第三个满足条件,那么第二个就会和第三个相等,就会产生矛盾。所以一个组里面最多两个数。我们对于每一个整数,如果在它之前有和它符合条件的数,那么就让这个数和之前的那个数抵消。否则,就让这个数单独成为一个组。这个题有很多种解法,我曾经用了字典树,然后炸了,所以推荐写 map,因为字典树不好重置,你要把指针数组也重置。map 很简单,一个clear()完事。
2024-02-24 16:24:09
204
原创 P2441 角色属性树 题解
我们发现,如果两个数x和y满足gcdxy1,那么这两个数就有同一个属性。证明:设gcdxy为k,那么如果k是一个质数,那么xy就有一个为k的属性,否则,将k分解质因数,也可以得到一个可以同时被xy整除的质数。n≤2⋅105,但是有一句话给我们指明了方向:本题测试数据随机,可能是假题。所以随机数据造出来的树大概率不是这种树:如果真的有这种退化成链的树,那么出题人可以立马去买一张彩票。我们算一下这种树出现的概率:如果长度只有10000。
2024-02-24 16:22:58
1091
原创 P3141 [USACO16FEB] Fenced In P题解
如果此题数据要小一点,那么我们可以用克鲁斯卡尔算法通过,但是这个数据太大了,空间会爆炸,时间也会爆炸。我们发现,如果用 MST 做,那么很多边的边权都一样,我们可以整行整列地删除。此时答案是1。此时答案是3。此时答案是5。此时答案是9。我们把第三列的栅栏删除,由于之前删除的两行栅栏导致第三列栅栏少删除一个,不用删除。你可以继续造更大的数据发现规律:我们先把每一列,每一行的栅栏长度算出来,从小到达排序,然后用双指针算法,两个指针i和j。
2024-02-18 22:08:40
1118
原创 P6171 [USACO16FEB] Fenced In G 题解
我们可以把每一个小方格看做一个点,要拆除一个栅栏就相当于给相邻的点连上一条边,使得这两个点联通,耗费的权值就是这个栅栏的长度。那么要使权值最小,我们就要尽量拆除代价小的边,同时,如果有两个点已经联通,连接这两个点的边就不用拆除了。我们可以用并查集来判断两个点是否联通。我们先建立纵横两个方向的边,再把每一条边按边权从小到大排序,遍历每一条边,如果这一条边连接的两点不联通,就给这两个点合并到一起,把答案的权值加上这条边的权值。最后输出答案的权值即可。
2024-02-18 13:25:56
493
原创 ABC341A-D题解
所以可以暴力枚举高桥所在的位置,如果他行进的过程中没有经过海洋就将答案加一。但是我们要的是最大的比上述不合法答案小的答案。如果两个跳的一样远就都跳依次,这两次不算在跳的次数内。首先,我们先讨论那些“有规律”的部分。我才不会给出详细的解法的,我只给一个小小的提示:懒标线段树!次后,较大的就是满足条件的,加到答案上即可。,而且跑不到这么多,所以执行次数不会超过。如果减掉前面“有规律”的部分后,发现。整除的部分减去它,还要在可以被。这个没什么好说的,就先输出一个。我们继续讨论,可以枚举,用。
2024-02-17 22:28:59
1324
1
原创 P5380 [THUPC2019] 鸭棋 题解
这是我写出的第一道紫题。纪念一下。我们用数字代表棋子。对于这个数字的个位,让1代表car2代表horse3代表guard4代表elephant5代表captain6代表duck7代表soldier。对于这个数字的十位,让0代表蓝方,让1代表红方。我们先写好判断棋子移动是否合法的函数,由于有7种棋子,所以就有7写好这7个函数之后,我们判断输入的棋子是不是我们自己的,如果不是,就代表这个命令不合法。如果是,就判断棋子类型,把我们写的函数丢进去。如果合法,就执行移动步骤,然后就是判断将军。
2024-02-14 15:15:00
608
1
原创 CodeForces Round 925 Div.3 A-F 题解
对于每一张截图,除开第一个数字,对于每一个剩下的数字,我们往后面的一个数字建一条有向边,不需要建多条,因为其他的关系可以通过这些边推导出来。我们选择每一种填充颜色,因为要覆盖整个序列,所以只有前缀和后缀才关系到我们的代价,对于当前数,一直找,知道找到数组前缀和后缀里的所有元素都和当前数相等,剩下的就是我们要覆盖的。对于每一个找过的元素,记录下来,不再讨论。如果遍历完都没有退出,就表明有解,输出答案,走人。我们发现,对于每一张截图,除开第一个数字,如果。大,最后统计答案位数,判断输出,完结撒花。
2024-02-14 14:56:51
1242
1
原创 ABC340 A-F题解
我们发现,如果序列头尾相连,那么我们每次要放的都是一个连续的区间,可以看题目的 GIF 图自行理解。那么这个题就是区间修改,单点查询,一个典型的线段树或树状数组维护差分数组,我用的线段树。如果这个答案没有被计算就计算这个答案,否则直接返回之前存储的答案。把游戏抽象化为一个图,每一个阶段就是一个点,那么连接。这个也是根据题面模拟,存一下序列的长度即可。,然后吧唧吧唧一大堆,就是想让我们求出一个。就可以得到正确的答案。和擦除它产生的数的代价。,这不就是典型的扩展欧几里得吗?,那么这个问题就很好解决了。
2024-02-10 22:40:56
1200
1
原创 P1966 [NOIP2013 提高组] 火柴排队 题解
由此可见,前面两项都是定值,就只有第三项是变化的,又因为让差小就可以让总体小,所以我们尽量让数列里面的对应元素变小。数组里面的下标,在这个号码上求一遍逆序对即可。数组里的标号要配对所交换的次数就是逆序对的数量。数组里面的每一个数的号码就是与之配对的数在。所以这个题也不难,就是要实现的东西有点多。,然后交换数列里面相邻两个元素,使得。数组里面的元素配对,就要将。数组里元素是第几大,将。
2024-01-28 19:24:03
798
原创 P1379 八数码难题 题解
这个题就是一个 BFS 的经典题目,将整个序列状态放到队列里,一一检索,如果达到答案就结束搜索。我们存放空位所在的位置,每一次取出时就不用寻找空位在哪里了。枚举将上下左右移到空位的情况,如果当前情况没有被搜索到就放到队列里,如果当前状态就是目标状态就停止搜索,退出。我们可以将整个序列当成一个数字存进一个 map 里去重,map 很快,查询只有log级别,所以可以在很优秀的时间复杂度内完成问题。这个题还可以用双向广搜,从起点和终点同时开始搜,时间复杂度更优,但是我不会。
2024-01-28 18:17:51
257
原创 P1131 [ZJOI2007] 时态同步 题解
这是一道树形 DP 的题,十分简单,既然要使到根节点的距离相等,我们不妨先处理一个子树,再一层一层往上处理,最终处理到根节点,这就是树形 DP。首先,我们创建一个dis数组,disi表示第i个节点到叶子节点的距离,那么对于它的所有子树而言,我们要找到一个距离最大的节点,让所有子树都和那个节点同步,再创建一个dp数组,dpi表示第i个子树保持同步的次数,dpi就是它的所有子树的和加上所有子树同步到距离最大节点的次数。同时,设自己的子树为v。
2024-01-28 14:44:55
1322
原创 P1005 [NOIP2007 提高组] 矩阵取数游戏 题解
这个题是一道高精度加上区间动规的题,题不难,但是码量有亿点多。将整个矩阵分成多个数列来处理,因为两个数列之间的取数关系互不干扰。我们设dpij为矩阵还剩从i到jdpijmaxdpijdpi−1j2m−ji−1×ai−1dpij12m−ji−1×aj1然后从外部扩展到内部就可以了。这里我们无法得到剩下区间没有的情况,只能从dpkk的情况在转移到答案。
2024-01-28 11:24:20
1388
原创 P1018 [NOIP2000 提高组] 乘积最大 题解
这个题我使用了记忆化搜索,记录当前搜到的点和分成的段数的乘积最大值,如果我们搜到这个点后发现这个点的记忆化数组比我们当前的乘积大就没必要再搜下去了,如果比我们的乘积小就更新记忆化数组为我们当前的乘积。然后处理高精度,这里我推荐将高精度写成结构体,重载高精运算符,这样写着要自然一些。建议压位,如果不压位可能会超时。什么是压位?就是将整个数当做一个10^k进制数,k最好为4。
2024-01-28 11:08:18
308
原创 [NOIP1998 提高组] 进制位 题解
其实这个题只要知道他是n进制的,就可以轻松写出暴力代码。因为它有n个不同的数,而如果是n+1进制就会有一些数不能用给定字母表示出来,如果是n−1进制就会有两个数是一样的,但是题目要求任意两数都不相同。理解了为什么是n进制后,就可以打出暴力代码。可以枚举每一个数分别是什么,用,再判断其正确性,如果每一个加法结果都正确,就输出结果,走人。如果判断到最后还没有找到,就输出ERROR!,由于3≤n≤9,所以可以将加法结果当成一个n进制数处理,但是还是用的int。
2024-01-28 10:43:39
426
原创 ABC338 A-E题解
可以将所有的边都赋予一个权值,对于每一个起点和终点,他的路径上所有的边的权值都加上另外一条较长路径比较短路径多的边数。,就代表右端点被某个区间包含,又因为是倒着处理,我们当前处理区间的左端点一定比相交的区间的左端点靠左,所以就代表我们找到了与当前区间相交的区间,输出。,所以我们可以枚举 A 菜品的个数,在判断冰箱里的配料是否足够,如果足够,在去判断最多能够制作多少个 B 菜品,然后寻找最大值就行了。而如果第一条边,第二条边被破坏了,我们就只能走更长的那一条边,就要多走一条边。,我们选择短一点的那一条边走。
2024-01-27 22:54:43
1328
1
原创 ABC335 A-E题解
贪心思想,优先选择比较小的点,对于每一个点能到的下一个点,我们将它们按他们的值从小到大排序,在加边时,对于起点的值大于终点的值的边,就没必要加了。,记录不同元素的个数,如果我要访问的点没有被访问,并且这个点比我当前所在的点要大或者相等,就继续搜下去。记忆化,记录下走到每一个点的答案值,如果往下走会更优,就继续走下去。循环即可,第一层枚举第一个元素,第二层枚举第二个元素,第三层枚举第三个元素,按次输出即可。的简单路径,使得路径中访问的数字是单调不递减的。最后输出,如果当前输出位置是矩阵中心,就输出。
2024-01-07 15:16:56
1059
1
原创 CF1165B题解
输入数组后,把数组的元素排个序,贪心思想,优先选题目数较小的题单,再用一个变量记录最多可以训练多少题,从左往右找,如果这个题单题目数比天数大,就选择这个题单,天数加一,最后输出天数就行了。
2023-11-16 14:40:31
77
1
TA创建的收藏夹 TA关注的收藏夹
TA关注的人