- 博客(34)
- 收藏
- 关注
原创 GDB(GNU Debugger)的使用教程
删除断点(一般在该指令后面加断点编号,断点编号通过。继续执行程序(一步到底或执行到下一个断点)继续执行程序(单步执行)
2024-10-30 20:38:37 332
原创 Educational Codeforces Round 171 (Rated for Div. 2) A~D
由于有这样一个优先级的事情,我们可以考虑队列,倒序枚举天数,如果当天能够购买商品就将价格先放入队列,如果不能购买商品就弹出一个能购买商品的价格,就是说一个0可以抵消一个1。思路:题目要求我们最多剩下一个数,那么显然对于偶数情况我们必须将序列内的数进行两两操作。那么对于奇数,我们就去枚举那个单独使用的数,注意枚举过程中需要确保左边和右边的数的个数都是偶数。思路:题目要求两条线段必须垂直,同时有一个值用来限定两条线段的长度,所以其实一定只能针对短的那条线段,短的那条线段的最大长度就是。天时,我们一定希望对第。
2024-10-30 17:51:10 863
原创 Educational Codeforces Round 166 (Rated for Div. 2)
思路:对于括号序列问题,有一个充要条件就是将左括号替换为 +1 ,然后将右括号替换为 -1 ,能够匹配好的括号序列结果就是任意一个位置的前缀和非负。接着这题是有先来后到的说法的,所以一定存在一个前缀(可能为空)是被安排到自己的位置上去,然后剩下后缀的话就是只能被安排到冗余的位置上,所以我们需要将我们用到的前后缀信息给处理出来。我们只要二分就好了,容易证明前缀长度是存在单调性的。思路:要求至少需要操作多少次,那么对于固定的数操作次数就是一定的,所以主要就是新加进来的数是哪个数,那么只需要枚举一下就好了。
2024-10-28 17:57:21 715
原创 Educational Codeforces Round 170 (Rated for Div. 2)
由数据范围我们知道是肯定开不了这么大的,那么这里有一个经典的trick就是,可以把智力和体力表示在一维上,即 记智力和体力的总和为s,体力为x,智力为y,那么 y=s-x。思路:容易发现我们选牌只能选择连续的一段区间,同时右端点一定是单调的,所以我们使用双指针算法就好了。那么其实最终的答案就是Alice多拿主牌的方案数乘以Bob多拿副牌的方案数累加起来,接下来考虑怎么计算方案数。表示前i个位置,智力为j,体力为s-j的最大贡献。地操作,那么我们可以考虑差分。为第i种花色,多拿牌数的总数为j的方案数,那么。
2024-10-22 16:27:47 623
原创 Educational Codeforces Round 168 (Rated for Div. 2)
思路:题目要求根节点的最终值最大,每一次操作能够使得父节点的值加一而根节点的值减一,所以自底向上操作的方案一定更优,同时我们应该保证每一次操作之后都应使得子节点的最小值不小于父节点的值,否则我们进行这样的操作是没有意义的。对于每一个k,我们都存储题目的查询,同时要按照怪物出现顺序的升序排序,因为显然对于同一个k,我们的等级越高能够枚举到的怪物就越远,由此来检查当前等级是否与当前怪物战斗。的前缀,这是显然的,因为对于同一个k值,都是从一级慢慢升上来的。,这样我们枚举所有的k,那次数也只有。
2024-10-13 16:43:42 889
原创 Educational Codeforces Round 169 (Rated for Div. 2) A~F题解
对于恰好一个点相交的情况需要关掉两扇门,一段相交可以关掉这个区间的所有门以及两端的门,这也与包络的情况类似,但是都要注意这个区间两端有没有门,所以式子为。对于不能直接到达的点,这两个点的颜色一定是互斥的,如果i点颜色是AB,那么j点颜色一定是CD。思路:对于每一次变大操作,我们都不能使得这个数比Alice上一次拿走的数大,否则Alice上次就会拿走当前数(因为我们的操作是游戏开始前一次性离线完成的),所以这个游戏的最优答案就是0。11需要三次操作,11…的操作就可以了,注意k是累计值,而不是单次操作的值。
2024-10-12 15:20:34 959
原创 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
需要注意的是,本题也有corner case,如玩家排在第一位,就需要将源点S的价值加进来,另外还需要注意记录最短路径的值(因为有多条到汇点T的路径)。考虑可行性:直观上想,我们先可以枚举两个点,剩下的一个点使用bitset进行优化,即使用bitset来刻画“对于某一点,剩下的点中可用点的集合”,本题是有两个限定条件的,即长度与种类,所以实际上需要开两种bitset。根据题目要求打好标记就好了,只需要注意一些corner case,如刚按下按钮的时刻、红灯变绿灯的时刻以及绿灯变红灯的时刻。
2024-07-31 16:27:15 664
原创 算法竞赛数据生成及使用Sublime对拍
最近几天看蒋老师直接使用了Sublime中的FastOlympicCode插件进行了对拍,出于兴趣来学习一下,关于插件的配置已经有很多大佬讲过啦,这里不再赘述。数据生成的代码我会放到最后,包括生成数组、区间、树、图。
2024-07-25 11:05:11 607
原创 Educational Codeforces Round 167 A~D题解
思路:首先有一个比较显然的贪心就是,每次合成后立即融化掉可以得到2点经验值,同时也可以回收一部分材料,所以实际上我们只需要求最多可以合成多少次就好了。思路:首先我们要明白,子串一定是答案串的一部分,接下来,我们要找出最多有多少子序列中出现的字符在这个子串中出现过(注意必须保持顺序的一致性)记为。,这两种情况是等价的。三种值,每个人对两部电影的评价如果不同我们肯定是要选评价更高的那个,答案一定更优。的坐标都会减1(注意这里我们移动完了目标点才会移动),所以目标点的坐标最小为-1,否则从原点出发永远无法追上。
2024-07-24 16:45:49 935
原创 最小环计数问题
首先我们能很自然地想到要先求出“最小环”的长度到底是多少,枚举每个点(枚举所有点的原因是,我们需要保证从环上的点开始枚举,才能求出最小环的长度),然后求包含当前点的最小环的长度。不妨设环长为len,对于当前搜索到的点与枚举的点所构成的线段,若边长为l1的条数为n,边长为len - l1的条数为m,那么根据乘法原理,我们能得到环长为len的环的数量有n * m个。具体来说,对于偶数环的情况,我们记录距离当前正枚举的点的距离为len/2的点的边数即可。的点时,y的路径数也需要累加上x的路径数,这里。
2024-07-17 23:35:11 348
原创 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)题解
思路:记录一下题目已经给定的字符串等级映射,然后对于每一次询问首先查询完整字符串是否已经存在,否则枚举字符串的每一个断点查询两个拆开的字符串分别是什么等级进行等级的拼接,若存在多个答案那么标记为。接下来处理查询中的序列,我们枚举所有可能重置骰子的方案,这里我使用了二进制枚举,那么接下来的事情就是就是开始对于每一种枚举方案搜索有多少种获得更大等级的可能性了。是给当前正在判断等级的序列排序,然后再依据题目规定判断等级,这样能够极大程度地减小处理序列的复杂度,读者可以自行体会。的两面,这样做的好处就是。
2024-07-14 15:13:42 831
原创 abc344E - Insert or Erase以及关于std::list的使用
特别注意,std::list与std::vector不同的一点是,除非它的迭代器被删除,否则是不会破坏掉的(不会像std::vector那样因为序列的改变使得序列中元素位置和迭代器发生改变),这就是为什么我们能够保存下来不断使用。题目要求不断对一个序列进行增、删操作,容易想到学习数据结构时关于这个问题的讨论,显然使用链表是一个非常不错的选择。在本题中,由于在增删时,我们总是需要对迭代器进行操作,因此我们就需要对序列中的每个整数所对应位置的迭代器进行存储。不支持快速随机存取。为使用std::map的复杂度。
2024-03-10 21:28:45 1932
原创 E. Iva & Pav
显然,与上一个数之后对于当前数来说是非严格递减的,那么对于每个数的每一位我们记录从这个数之后到哪个位置最先变为0。上为1,我们是不可以把答案直接更新到上面的位置的,因为对于低位来说可能会导致与起来的和无法。一道二进制好题,这题可以前缀和或二分解决,这里给出一个纯二进制做法。变量,这个值用来维护期望可以到达的最远位置,用于最后来更新。个数之后第一个使得与和等于0的位置。的二进制高位开始枚举,如果某一位。上为0,那么答案就可以更新到。,所以对于每一个询问我们把。由于题目要求与起来的和。,因此我们需要维护一个。
2023-12-09 21:31:56 141
原创 AtCoder Beginner Contest 330(A~F) abc330题解
这样方案的个数,这些o不要求一定相连,那其实我们只需要枚举那个关键节点然后每行每列计算一下除去当前枚举节点还剩下多少字符就好了,那么每次对答案的贡献就是。注意到mex的性质:当前序列中最小的没有出现的非负整数,因此mex的值至多不会超过。坐标最外面的两个点,根据上面我们所考虑的,最外面两点到这个矩形的距离为。题目是说要在规定操作步数之内最小化正方形边的值,容易想到二分答案。,所以只需要比较一下哪个值使得不等式右边的结果更小就好了。,所以要使得不等式右边最小,Y的取值集合其实只有。,x为当前正在二分的边长。
2023-12-09 10:05:42 274
原创 AtCoder Beginner Contest 329
所以我们可以在每个位置上开一个桶,而引起最大值变化只有可能是在某一个位置贡献+1时,当前位置成为贡献最大的位置。,也就是说先前被撕掉的位置是可以继续撕下去的,正着来想其实就是后面贴上的串将先前贴上的串给覆盖掉了。我们每次将物品少的集合放到物品多的集合中,然后按题意交换集合下标,我们可以直接使用。统计该字符串中不同子串的个数,同时子串的要求为必须是同一个字符的重复,如。,显然是会超时的,因此重点需要我们考虑如何进行优化。串之后,我们考虑临近位置能否撕掉并将其加入队列。对于每个元素所在的集合,
2023-12-08 12:44:22 143
原创 2023年沈阳站K. Maximum Rating
贪心地考虑如何对序列进行排列,要使变化次数最少,应该先掉分在上分,并且在上分时,应该先放置涨幅较小的。要使变化次数最多,就应该先上分再掉分,这样每次上分时都必然能够增加一次变化次数。中维护当前值有多少且这个值加权之后是多少就好了。小数的和不大于所有负数绝对值的最大取值、正数有。小数的和,那么可以使用权值线段树,的变化值,要求带修地求出最大。题目中给出的元素均为每一轮。变化次数可以有多少值。个,那么变化次数最多为。
2023-11-17 22:27:44 602 1
原创 AtCoder Beginner Contest 322 F-Vacation Query
所以一定要维护前缀和后缀的值,但其实考虑到这还不够,因为当左儿子的区间中全部为1时,新节点的前缀就变成了整个左儿子部分与右儿子的前缀相加,所以还需要有一个值来维护这个区间是否全为1。对于操作2我们考虑如何维护两个节点的信息,新节点的答案有三种可能的情况:左儿子的前缀,右儿子的后缀以及左儿子的后缀和右儿子的前缀。题意:有两种操作,操作1是将一个区间内的0和1做flip操作,操作2是查询一个区间内的连续的1的个数。首先,对于操作1的flip操作我们很容易想到给每个数异或一下。就成了我们必须要维护的信息。
2023-11-16 20:31:32 153 1
原创 F. A Growing Tree
但是我们再仔细考虑一下,实际上当每一个点新加进来的时候,这个点的子树的值都相等,因此每次插入一个新点的时候给这个节点的子树减掉当前的值就相当于新插入一个点了。这题表面上往树上动态加点,容易让我们觉得直接往子树上加权值会影响还未添加进来的点。由于这题是区间修改单点查询,所以实际上可以用树状数组来差分。看到给子树加和是很容易想到树链剖分的。当然也可以使用带懒标记的线段树。
2023-11-15 21:00:20 122 1
原创 Educational Codeforces Round 157 (Rated for Div. 2)(A~D题解)
就是看钥匙和宝箱的位置,由于拿钥匙不消耗体力,因此如果先拿钥匙或者同时拿到钥匙和宝箱是可以直接打开宝箱的。这样做的原因其实就是,左边部分减去是和右边部分加上是等价的,对于右边的部分也类似。对于这类涉及位运算的题目,首先一个就是应该考虑拆位,这个大家应该是都能够想到的。按照长度来存储字符串,然后枚举这两个长度的字符串看是否满足情况。个点划分为两个集合,使得集合内部相邻两个数的差值的和最小。也就是说只要确定了第一项,那么后面的每一项就都可以确定了。其实是异或操作,异或其实是可以相消的,把。
2023-11-15 20:20:48 168 1
原创 AtCoder Beginner Contest 328(A~G)
这道题我做的时候很麻烦,甚至还把每一位都拆出来了,实际上只要把月份和当前的是哪一天转成字符串加起来比较一下整个串的每个字符是否都等于这个这个串的第一个字符就好了。题目是要求一个最小生成树,但是是在模数意义下的,因此就不能靠平时用的最小生成树算法来解决了。这个字符串,每次都从左边删,其实已经暗示的非常明显了,就是要用栈。,其中二进制中1的个数是非严格递增的,因此可以借此去优化掉一维枚举。题目中给出的两种操作实际上是相互独立的,于是可以考虑DP。,看起来就是可以爆搜的,但是要考虑剪枝,由于生成树最多有。
2023-11-13 21:46:56 274
原创 2023XCPC个人补题题解
对于每一个位置,我们可以枚举他能够胜多少局,其能否取胜其实与他在这个子树中值的排名以及还有多少剩余的交换次数有关,因此我们只要按照选手的强弱值从小到大加入我们构造的这棵树就好了。从这个题目中也可以学到对于一棵树,从子节点找父节点的方法:其实是通过编号,而不是具体的区间,顺便也复习一下树的编号吧。中,可以同时不放入但不能同时放入,否则两者不互素,那么对于。的条件,对于每一个素因子,我们可以把它放在。时,化为最简分数后一定会与其他互素的一组。的素因子组成,然后就可以考虑如何选数使得。的个数有多少,其中限制了。
2023-11-10 22:20:15 126 1
原创 AtCoder Beginner Contest 327(A~F)题解 abc327
把题目抽象出来就类似于在一个二维平面内有一些点,然后这个时候要选定一个长宽固定的框,使得这个框内的点数最多。观察式子的结构会发现其实除了左式的分子,其他部分相对来说都是比较固定的。那么首先可以确定的就是以某一个点作为这个框的左下端点一定包含最优解。那么我们就可以枚举时间,以位置建线段树,执行区间加和区间查询的操作。个数时分子的最大值,然后就类似于一个背包问题。时就给长度区间-1,答案就是每次取全局最大值。最开始考虑了贪心策略,但实际上是错误的。作为左端点,那么这个框能够覆盖的时间就是。
2023-11-09 19:03:46 272 1
原创 AtCoder Beginner Contest 325题解(A~G) abc325
之间的格子里,然后每个格子只能放置一个物品,那么结束时间早的物品先放一定要优于结束晚的物品先放,但是如果说直接去枚举时间一定是会超时的,因此我们考虑从哪一方面进行优化。当然,如果在枚举这个点的过程中每次都从这个点向终点跑一次最短路一定是会超时的,所以我们应该预处理一下,从终点倒着跑一遍最短路,这样其实就能得到每个点到终点的最短路了。以开始时间为第一关键字、结束时间为第二关键字排序,用优先队列存储结束时间,每次弹出结束时间最早且大于等于当前时间的物品作为当前这一步放置的物品。个第一道具时所需第二道具的数量。
2023-11-04 17:11:53 378 1
原创 AtCoder Beginner Contest 326(A~F) abc326题解
不过这个题的写法需要学习一下,当这一行/列的状态为0时说明还没有填入字符,此时判断一下当前拟填入的字符是否为需要填入的字符;其次还要判断一下这一字符在这一行/列是否已经存在了,这些都使用了状态压缩的技巧,写起来很方便,值得学习。当然这里还要做一个类似前缀和的东西,因为小点数的点一定会经过大点数的点,也会有相应代价。算法,就是搜一半停下,然后以当前这一半的终点为起点去搜另一半,这样就能极大地优化复杂度。为起点的区间就好了,个数的话其实就是二分求右端点的位置。串的矩阵,由于矩阵很小,所以显然是可以爆搜的。
2023-11-03 19:14:34 423
原创 Atcoder Beginner Contest 324题解 A~F abc324
两个串拼起来包含一个子串,其实就是前面的串包含这个子串的一部分,后面的串包含这个子串的另一部分。那么我们仍然可以从前缀和后缀的角度来考虑,若前串和后串对于子串的前缀和后缀的包含情况的加和大于等于这个子串的话说明这两个串拼接起来之后包含这个字串。中的字符数目是否够用,不够就说明当前枚举的数不符合条件,否则符合条件,贡献+1。不断除以2和3就好了,最终得到1说明符合题意,否则不符合。,如果满足条件说明可以以此作为答案下限,否则作为答案上限。,这些数的平方就好了,枚举每个数的时候考虑原串。
2023-10-16 20:52:45 298 1
原创 Educational Codeforces Round 156 (Rated for Div. 2) A~D题解 edu156
手玩一下:假设当前序列有[a1, a2, a3, a4],如果当前符号为<,当前数一定只能放到序列最前端,同理若符号位>,当前数一定只能放到序列最后端,所以对于这两种符号来说方案数只有一种,而对于符号?从头遍历原串,每次将一个字符放入栈中,在删除字符之前,栈中的元素一定是单调递增的,当出现了一个小于栈顶的元素时,就可以删除当前字符串中的最后一个元素了,注意至多删除x次,操作完成后直接输出第y的字符即可。本身是3的倍数,因此减去一个非3的倍数的数,剩下的数一定也不是3的倍数。的位置,否则就删除最后一个字符。
2023-10-13 12:09:06 188
原创 JAVA基础笔记
字符串比较不能直接用等号,要用重载父类函数需要加标识类并未重载[]需要用抽象类写关键词abstract区分好各种关键词的使用场合。
2023-07-14 15:07:59 67 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人