- 博客(29)
- 收藏
- 关注
原创 CF. Ice and Fire
若字符后缀为10时,我们知道只要后缀为0,那么1一定能够获胜,于是,我们可以让1一路获胜,最后被任意除1以外的数字击败。首先,根据题意得,最后一轮为1时最小的1一定没有获胜机会,同理,最后一轮为0时最大的4也没有获胜机会。若字符串后缀为11时,与上次相比,只是让次小值2不能获胜,但又新添一个参赛玩家。因此,获胜的人数不变。若字符后缀为00时,同上。字符后缀为01时,也同上。
2023-08-11 09:06:12
150
原创 P1114 “非常男女”计划(引入相对差值概念,通过计算相对差值来检索一段序列中两个数字相等的最大长度,时间复杂度(on)
因为两个相对差之间经过了一系列变化最终又成为了那个相对差,这说明什么呢?说明之间的一系列变化全部抵消,也就是说这个区间之间男女相等。转化成通俗语言,0代表女,1代表男,我们要在这一段序列中找到长度最大的男女相同的子序列,也就是,0,1相同的子序列。除此之外,我们要注意,不能更新0的左区间,为何,因为最开始就是最左边的0区间,我们要注意分开。每一个位置我们都记录男女相对差值的大小,两个相对差值相同的端点之间,就是我们的最大长度。再再再强调几点,我们还需要做什么呢?引入一个相对差的概念。那么,应该如何做呢?
2023-08-10 16:02:11
220
原创 codeforces:Sum of Two Numbers(拆位平分,让两个数的各位数尽可能相等。)
我们明显发现这一错误,这一操作可能会让某个数字变成10的倍数,但是样例中另一个161-81,80却是符合条件的,于是我们得到了结果之一:向上取整的如果是10的倍数需要它特殊分析。很明显的思路就是,偶数平分,奇数一个向上取整一个向下取整,大部分情况下,这样保证了答案的正确,但是样例的最后一个19-10和9。首先,我们分析数据范围,高达10的九次方的数据范围一定不能用on的遍历枚举。因为我们要求的是各个数位的和相差不超过1,那么我们在将n分成各个数位后,如果是偶数那么平均分配,不会对答案产生影响。
2023-08-10 10:37:48
149
原创 区间DP(新手个人理解,常见问题分析,以及模板)
区间dp就是求解一段区间上的最优解,主要是通过合并小区间的最优解进而得到整个大区间上面最优解的dp算法。发现什么了吗?题目要求我们每一次仅能合并相邻的两堆,最终要求我们求出合并出一堆石子得到的最优解,不就是和这个区间DP的解释相同吗?合并小区间的最优解,得到一整个大区间上面的最优解。
2023-08-09 15:25:41
155
原创 P1629 邮递员送信(反向建边+对于floyd时间复杂度及,迪姐克斯拉算法等的新理解。)
假设要问从x到1的最短路,为x->a->b->c->1,也就是说x->a,a->b,b->c,c->1都有路可走,那么我们想想,从x开始x->a,a->b,b->c,c->1的最短路。把邻接矩阵倒过来,不就是从1开始1->c,c->b,b->a,a->x的最短路吗?于是这时,我们把x->a,a->b,b->c,c->1这4条路径变为1->c,c->b,b->a,a->x,然后从1开始跑最短路,而它们的最短路是一样的。我们还要注意,最后我们还需要返回邮局,也就是说我们还需要反向求出最小值,我们该怎么求呢?
2023-08-09 10:51:57
58
原创 CFB. Array merging
我们是要找出一个最大的元素相同长度,那就是要让尽可能多的相同元素放在一起,而随后我们也可以发现一点,任意两个子串其实是能够连接在一起的,那么接下来的思路也就很简单了。我们可以分别遍历两个数组,然后在每一次遍历中求出每一个数字在两个子串中的最大连续长度,最后,通过相加比较找出最大的连续长度。统计每一个字串数字出现的次数,然后贪心来做出每一次选择,我们很快就能找到反例。合并两个数组,让我们求其中元素相同的子串的最大值,我们应该怎么想呢?那么,应该怎么做呢?
2023-08-09 09:34:21
76
原创 CF1800D Remove Two Letters
这样,我们就将问题转化为了这N-1个新的字符串中有哪些字符是相等的,而通过观察样例,我们很容易发现一个事情,对于连续相同的字符我们应该对他们进行删除。我们很容易发现,ababa总次数减少了三次,aaaaa也是减少了三次,也就是说如果对a1,a2,a3来说,如果a1等于a3那么总次数就应该减一。由题意可知,要我们将包含N个字符的字符串中任意删除两个字母,从而得到新的字符串,问我们最终有多少个不同的字符串。对于一个这样的问题我们可以先尝试把他的总次数先求出来,再计算怎么样才能将这样的总次数减少。
2023-08-09 09:28:01
63
原创 CF1730C Minimum Notation
分析题目可知我们要最小化字典序顺序,但是我们只能将某个字母删除并将它变为更大的字母,也就是说我们不能通过删除某个字母来达到全化为0的目的,我们只能将每一个字符串中所有小的字母尽可能地往前提。答案就是在这个字符串中,如果在他之后有比他小的字母,那么他一定需要被删除并保存到后面去,那么这是什么?但问题来了,我们可能要删除掉一些字母我们如何来判断哪一些字母应该被保存呢?
2023-08-07 15:21:24
55
原创 codeforces Matrix of Differences
毕竟,我们只有这样一条链,很容易发现,只要我们能够让这种关系出现在矩阵种,那么这时就是最优解。答案是k-1种,那么如果按照题目中的要求来看,我们有没有一种可能让n*n-1种差值都出现呢?一字长蛇阵法,利用奇偶性来判断一个位置应该放哪个数字,当然之前还有一种f标识法实现插空放置。我们先来分析他的一般条件,如果有K个数字那么我们出现最多的差值情况是多少呢?转化矩阵:我们发现当为偶数行时。显然通过这种情况我们就可以尽可能多的找出最多的差值情况。为了达成这个目的,我们很容易想到最大最小交错放的情况。
2023-08-07 11:18:29
122
原创 P1387最大正方形(dfs搜索,加暴力,加前缀和,加dp四种方法。)
我们遍历一个点,如果这个点能访问,那么就以这个点为起始点开始搜索,用xx,yy记录该点,同时向下方扩展,如果满足正方形,边长加一,继续扩展搜索。首先,我们可以考虑枚举正方形的边长,以一个点为起始点,不断向右以及向下延申,如果这个边长能够符合条件,那么就记录并更新,否则继续从下一个点开始枚举。除此之外,我们还可以怎么样进行呢,答案就是前缀和,遇到0,1这样的情况时我们当然可以用前缀和,或者记录其相对位置的办法来特殊处理,从而得到答案。答案就是看看她的面积,也就是看一看这一段区间内的前缀和是否符合条件。
2023-08-06 10:36:42
46
原创 P1144 最短路计数(如何进行最短路计数?)
我们来思考spfa算法每次是怎么进行更新的,spfa算法每一次的更新都是基于当前的t点能够带给更小的价值来达到这个点,于是我们有了dist[j]=dist[t]+w[i]代表着到第j个点的距离,由原来存储的最小值更新为了到t这个点的最小值加上w[i]的值。答案也很简单,ans[j]=ans[t]这样我们就得到了到j的最短路是由t带给她的,但是仅仅这样还是不够的,因为我们存储的是最小路径长度所以我们很容易想到当dist[j]==dist[t]+1时,ans[j]+=ans[t]这样也是一重更新。
2023-08-04 19:51:06
37
1
原创 P1807 最长路(最长路的思考,以及特殊情况的判定学习)
给定的题目要求我们求出最长路,众所周知我们只学过最短路算法,但是解决思路的话也很简单,那就是将边的权值取反,然后利用最短路算法SPFA求出她的最短路,将得到的权值取反输出,得到的就是最长路。但是就这样算下的话我们只会得到78分,聪明的小美小帅会认真研究题目发现还有到达不了的情况,于是我们特判一下。在有关图中的判断中,我们需要思考几点,边数为0的情况,到达不了的情况等等,这样才能让答案完美。好了,现在89分,怎么都找不到哪里出现了错误,原来是还有边数为0的情况,这带给我们思考。
2023-08-04 17:38:04
290
1
原创 P1119 灾后重建(FLOYD算法的本质,加深理解。)
很简单,就是用来遍历每一个点,看是否能有中转点用来更新距离,使得距离最小化。每一次都是前k个点,看能否有更新减少最低距离的数据。也就是说,如果这N个点中有的点在特定时间不能用,就不能用来更新最短距离,是否发现了什么》?这个算法的三重循环,内部两重循环很好理解,就是不断遍历存储在邻接矩阵中的每一个点,那么最外层的k循环是用来干什么的呢?于是,我们只要在最外层判断哪些点能用来更新,然后将他更新之后,输出在特定时间的距离最短就可以了,是不是很简单呢?相信学习过的人都觉得很简单。没错,就是和这道题目对应的。
2023-08-04 15:34:21
60
1
原创 CFTear It Apart(隔位删除的实现,以及字符串对数的讲解)
那么怎么进行这样的删除呢?很容易想到通过一个f的变化,每删除一次就变化f,f=0删除,f=1不删除,每一次更新,就能实现隔一个位置进行删除的操作。我们想到了遍历这个字符串,看是否都是相同值,也有其他办法比如看看她是否还更新。我们可以通过建立一个flag标记数组,flag=1为没被删除,否则被删除。目的是为了达到字符串中所有字母相同,那么最后字符串中一定仅仅剩下一个字母。如何知道一个字符串已经被删除干净呢?是隔一个位置删除,直到不能删除为止。那么如何知道一个字母是否被删除呢?我们的删除操作是什么呢?
2023-08-04 10:16:02
72
1
原创 CF1539C. Stable Groups
我们需要将这个序列分为若干个按照升序排列的序列,在这个序列之中,两个数的差不能超过x,最多可以插入k个数来让我们的数尽可能少地分为若干个组。我们将插入的数字当作隔板,一个隔板能分成两个区间,两个隔板能分出三个区间,我们每一次求的是隔板数,而不是区间数,因此我们需要将b[i]-1。很明显的一个贪心,我们应该将k尽可能地利用在利用率大的地方,这是哪里呢?因此,我们先贪心地排出a序列,在通过差分求出两个相邻数的差值,再通过排序,最后边比较边处理。需要注意的是在其中我们有一个吧b[i]-1的操作,这是为什么呢?
2023-08-02 17:19:24
52
原创 CF1962EBinary Deque(题目中一定要注意的相对区间大小问题。)
对于这种0,1计数达到某种条件的问题,我们还很容易想到通过某一个数组记录值为1的位置,这样的话我们就可以很容易得到两个1之间有着几个0。引申而出思考,我们记录了每一个具有某种关键性质点的相对位置,如果问题与这些相对距离有关,我们就可以通过这种方式来解决。我们很容易想到的是,求出一个值为s的子序列,由总长度减去这个子序列的长度就是我们最少删除掉的值。接下来,通过这样的方式我们更加容易地想到可以通过序列长度来判断这个序列是否有着值为s这么多。而对0的增加删除我们也可以通过这样的方式。
2023-08-01 16:00:16
34
1
原创 DFS1.高手在散步(洛谷p1294)
一个是需要保存我们遍历过的点,在这里也就是保持着曾经走过的距离,这样我们可以直接在每一层的dfs中直接加一个数xian表示现在的距离是多少。dfs还需要回溯和判别,我们在判别这一段距离能用后,需要将这一点标记表示已经访问,并且将现在的距离加入到xian当中去。首先,我们直到dfs算法就是将每一种可能都遍历一次,因此我们的ans答案直接在里面进行max更新就可以保证最大。我们得知,高手可以在任意一点开始遍历,这也就意味着我们必须在主函数外围加一个循环,确保能从每一点开始更新。其次,dfs需要什么?
2023-07-31 20:53:33
51
1
原创 codeforcesB. Vika and the Bridge
之后,我们可以分析题意得知,这是从0~n+1这么多个位置进行跳跃,每一次都只能跳到颜色相同的板子上面,但我们能够将其中一块板子的颜色更改掉。但别忘了我们还有一次将最大距离变为二分之一的机会,所以我们还需要求出次大距离,那么在掌握这些之后,所有就易如反掌了。细节问题,我们还要注意这是从0~n+1的问题,如果我们不注意N+1与上一个木板的间隔的话,就会wa.,首先,我想到了二分答案的方法,但写不出check函数,如果有大佬愿意的话,希望能够分享一下。怎么求出每一个板子的最大跳跃距离呢?
2023-07-31 20:02:35
85
1
原创 map的个人总结。
map提供一对一的哈希,比如map<string,int>就建立了一个字符串和一个数字之间的对应,其中每一个关键字都会在其中仅仅出现一次。第一个关键字叫做key,只出现一次。第二个关键字叫做value,由key指向对应。注意,map在实际上是有着自动排序的功能的。
2023-07-31 08:39:28
59
1
原创 p1757通体之分组背包
有一个体积为V的背包,有N组物品,从N组物品中每组只能选择一件物品,我们要达到的要求是让物品的总体积不超过背包的体积V,并且让整个背包中所装的物品价值最大。让我们回到小明的通天背包,很明显发现这个问题中既没有给我们分组的组数又没有在第一时间告诉我们每一个组都有几个物品,但其实还是挺简单的。我们只需要在每次转移中对单个的第K个物品进行计算就可以,其实在我看来也可以用0,1背包来理解。该问题的集合是只从前I组物品中每组选择一件物品且总体积小于V的所有集合。在第I组物品中有什么样的方式呢?选第i组第一个物品。
2023-07-28 16:56:10
60
1
原创 0,1背包Cut Ribbon剪彩带
换一种说法,体积为N的背包中,有a,b,c三个体积的物品,有一种让a,b,c尽可能的多并且,a,b,c正好等于长度n的方案。就会变成1,但实际上,这可能并不是合法的表示方式。通过初始化为负无穷,我们可以确保只有经过合法的状态转移后,1 给定一个长度为n的缎带,可以剪出长度为a,b,c长度的缎带,要求剪出的缎带数量尽可能的多。初始化为负无穷的目的在于保证动态规划的正确性。在动态规划过程中,我们会尝试从。的初始值设为0,那么在第一次更新之前,那么怎么能用背包来解决呢?
2023-07-27 20:35:08
123
1
原创 0,1背包模板以及洛谷积木城堡的理解。
通过保存每一次状态转移中的高度,我们就可以得到每一个高度是否在某个城堡中被使用过,再这样的方式下,我们就可以通过统计每一个高度出现的次数,得出是否有一个高度满足所有城堡都能达到,并且最大。小孩可以从城堡中的积木中选择移除或者不移除,每一次的最大高度就是所有积木的总和,从这个子问题中可以看到0,1背包比较明显的特征。0,1背包经典例题,限制体积的情况下,对每件物品选或者不选进而得到有限条件下的最大价值。分析一个子问题,看题目,小孩只能选择从城堡中移除积木,即什么呢?2.每一个积木可以选择移除或者保留。
2023-07-27 16:40:48
53
1
原创 codeforces873D. Matryoshkas
分析问题,题目描述为将一个玩具分成了一个二元组,(s,m)s代表从某个数字开始,m代表从这个数开始连续几个数是这个玩具的构成,题目要求我们求出玩具的最小个数。通过map不断访问每个连续数字区间段的次数,如果次数小于等于0,则终止,代表着一个玩具的构成。统计某个数字的次数,很容易想到如果某个数字的次数现在还不为0,那么这个数字就可以参与到某个玩具的构成之中。首先,我们分析出玩具的构成两要素:1.从某个数开始。我们分析数字的性质,只与数字本身有关,而与数字在序列中处在什么位置无关。其次,连续的一段序列。
2023-07-27 16:24:52
63
原创 codeforces Vaccination
根据以上就可以很容易得到一个更新的思路,我们每次枚举每一个人,如果她和前面的人相距大于d+w的时间,就需要答案加一,或者当其数量超过K时都需要增加一个答案。其次,我们知道每一个病人最多等待w时间,很容易想到贪心思路,让每一个病人都等到最后的w再服用疫苗。还有,至关重要的一点,我们知道一个疫苗最多能使用d时间,否则需要答案加一。首先我们知道每一个病人有自己的到来时间。最后,注意疫苗的包数和k数。
2023-06-14 21:25:54
77
原创 codeforces Make It Permutation
代价值无非就是增加和删除,对于每个特定的数字,我们需要删除所有大于他的数字,增加所有小于他但不在排列中的数字。我们不需要具体枚举需要增加或减少哪个数字,因为我们只需要计算代价的大小,因此我们只需要n-i表示大于他的数。接下来,我们需要考虑这样一个问题,那就是什么样的全排列代价最小,很明显,我们需要枚举每一个存在于全排列中的数字,计算最小的一个代价值。对于一个全排列,我们不得不做的事情就是将整个排列中全部相等的数字删掉,这是无法避免的。好了,别忘了,还有一种可能,那就是全部删除然后加1。
2023-06-14 18:05:53
171
原创 NOIP2012]借教室
来源:牛客网在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。
2023-06-13 15:22:39
201
1
原创 codeforces-lamps
2:点亮方式:我们要注意到当ai<=x时候这盏灯就会损坏,而x是当前亮着几盏灯,我们可以从这之中得到一个什么新思路呢?就是让数值小的灯放在前面,这样的话就能够点亮尽可能多的灯,从而让我们点亮最多分值。1:由以上思路我们可以得到,需要以ai为第一关键字排序,bi为第二关键字排序,得到一个优先级序列,我们在每次选择对应段的即未损坏段的最大值,更新到我们的ans中。1.得分方式,我们需要点亮一盏灯,这样我们可以得到点亮这盏灯的分数值bi,很容易想到我们需要在有限的次数里尽可能点亮bi值大的数字。
2023-06-13 09:10:10
188
1
原创 codeforces DAY 1 Contrast Value
从a的子序列中挑出几个权值加起来与a序列原本权值相同的序列并不容易,既然是求子序列我们是否可以考虑一种保持答案不变的删除方法。很显然,ai==ai+1,直接删除,不影响结果。以上两种情况ai都可以直接删除。
2023-06-02 16:23:50
72
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人