- 博客(127)
- 收藏
- 关注
原创 ABC 344
格子里面只能往下走或往右走,其中往下走或者往右走都需要花费一个step,并花费一定的能量。个string数组,依次拼接,每次只能从数组里面选取一个字符串拼起来。,当能量不够时不能行走。停留在原地可以获得能量。都是大小为100以内的数组,给出。python split最快。,但要花费一个step。最少需要几个step。保证操作中无重复元素。求数组最后的所有元素。
2024-09-05 13:17:44 511
原创 vector如何实现有序数组?
但我们可以使用vector和lower_bound进行类似的操作:使用lower_bound找到插入的位置,使用vector::insert插入该位置。正统的做法是维护一个最大堆和一个最小堆,最小堆的数在后半部分(比最大堆大),最大堆的数在前半部分,每次取最大堆的堆顶。但是写起来比较麻烦。python中有第三方库SortedList,C++并没有这样的stl库。,使得其保持有序,而且支持插入时间为。有序数组维护一个序列。
2024-02-07 09:27:41 406
原创 贝肯鲍尔逝世
可以说上古大神里面最亲切,也是每次电视转播里面都坐在拜仁看台上面的老朋友一样的教练、主席,他也抵不过岁月,走了。一个年轻人没有电子游戏的、足球的黄金时代的终结。90年世界杯的贝肯鲍尔和马特乌斯。
2024-01-09 08:06:04 382
原创 AtCoder ABC176
因为答案肯定在maxh和maxw的那些行列中,因此遍历一下行h和列w,如果map[h][w] == 1则跳过,不然就可以直接确定有一个点的答案是maxh+maxw。普通的memcpy是过不了的,因此需要记录一下每次发生update的点对。设dp[i][x][y]是第i次结束后留下牌面为xy的最大得分。在上一轮留下牌为bb的情况下,可以拿走bbb,转移为aa。转移的时候我们需要遍历所有的牌dp[i][j]转移的时候我们可以遍历剩下的一张牌i,那么。上一轮留下两张牌为ax的情况下,最短路的做法,最小堆维护。
2023-12-14 15:58:40 68
原创 AtCoder ABC175
起点向每个字符串连一条权值为w[i]的边,从回文前缀和回文后缀向终点连一条权值为0的边。在单纯的dp路径问题上增加一个维度,表示当前行拿到k个数的情况下最多能得到的分数。每次维护字符串本身,以及字符串是在左边拼接还是在右边拼接作为一个状态节点。如果能移到负半轴,那么取余数r求r与d-r里的最小值。比如abcab可以看成(abcab,0)每次拿这些节点去匹配字符串,相当于一条边。如果不能移到负半轴,那么终点就是答案。正数和负数是一样的,因此取绝对值。匹配cba后变成(ab, 0)再匹配cba后变成(c,1)
2023-12-12 16:51:54 65
原创 AtCoder ABC174
现在遍历颜色数组c,取pos[i]为当前color的最新位置,维护每个color的在区间内的个数(只有0或者1)。换句话说,每个color在要维护的数列里只出现一次并计数1,这样可以保证区间内color的数量就是区间color集合的元素个数。题目本身不难,这种求最大值里的最小值或者最小值里的最大值都可以用二分来进行求解。但是即使用浮点数往上取整,很容易有精度的问题,WA一个点。一开始理解错了Round Up的意义,以为是四舍五入。首先离线查询,按r前往后排序。最后的R置换最前面的W。
2023-12-08 13:30:44 79
原创 AtCoder ABC172
正确的方法是二分答案,并在答案n中遍历第一组选取的i与第二组选取的n-i个数。这样就可以通过质因数分解的方式,枚举出能整除n的质数a,然后通过上述公式计算。如果贪心去选,始终会选第二组。而正确答案显然是选第一组。例如第一组是8 1 1 1 1 1 1…第二组是7 7 7 7 7 7 7…时间内暴力解决,即调和函数。这里采用了另一种解法,在。虽然N很大,但是可以在。
2023-12-06 17:23:57 92
原创 AtCoder ABC170
BFS ,采用dist数组标记,如果已经预先访问到了,而且计算得到的步数是相同的,那么就break,不需要再浪费后面的步数去计算。模拟题,使用stl中的multiset就可以。从小到大排序,有相同数不计入,暴力计算。维护幼儿园的最大堆,以及总体的最小堆。
2023-12-05 11:23:39 47
原创 AtCoder ABC165
找规律1,这个规律比较简单,打印一下易得。LIS在树上的应用,模板题。所以遇到这种情况加1即可。注意递归前后保留上下文。搜索,然后check。
2023-11-29 11:25:19 51
原创 AtCoder ABC163
如遍历到u=2后,枚举子节点3,发现子节点里面最大子树和为2,还剩下sz[v]-2=3。在dfs处理时,设当前的节点为u,不能简单的将sz[u]加到sum中,而需要预先记录下之前的sum值。的用意在于,确保取2个数与取3个数下面取到的和是不相同的。sum[i]数组按搜索顺序,意思为访问到当前,颜色为i的最大子树和。以上图为例,访问到2完成后,红色最大的子树是以2为节点,sum=6。的情况下,检查能取到的最大和与最小和,此时中间的所有数都能取到。本题的关键是建立sum数组,从而求出连通集的大小。
2023-11-28 13:33:37 69
原创 AtCoder ABC162
但实际上k的取值范围很小,我这里取的稍微放大了一点范围。然后遍历后两个数,求第一个的前缀和。为不选中i位置的数周前面一共选中了k个数的最大和。为选中i位置的数后前面一共选中了k个数的最大和。这是一个调和级数的时间复杂度。空间复杂度用滚动数组优化。注意到每个值g的方案。
2023-11-23 17:47:19 62
原创 Atcoder ABC159
既然n范围是10,那么在n的宽度上做一个位操作,若i位与i+1位之间有切割,i位设为1,枚举横方向的切割方案,然后在竖方向上做贪心。先统计总的,然后减去选到的那个数再重新计算。观察了一下,发现在做到 i位时,可以去计算。其中sum是当前计算的和,F代表方案数。的三重循环,因此要记录一下前缀和。总体来说本期比较简单。
2023-11-22 08:33:02 60
原创 Atcoder ABC158
选中时右边覆盖链一直往右覆盖,需要找到覆盖链不能覆盖的第一个数next dp[i]+=dp[next]每个数进入后,在被覆盖到的时候出栈,因为被覆盖了以后就没有继续存在的意义了。设置两个数组分别代表前后加入的字符,reverse时交换数组。10和大部分质数是互质的,因此可以用前缀和的方法。范围足够小,遍历100/0.08内的整数就好。2和5与10不是互质的,但是只要看尾数即可。为了方便在栈里加入一个很大的数代表位置n。不选时dp[i]+=dp[i+1]设dp[i]为从i到n的方案数。
2023-11-21 14:31:12 74
原创 AtCoder ABC156
枚举0的个数,设有i个位置为0,那么剩下的n-i位置中要安放n个球,且每个位置至少放1个球,a个球放在b位置中每个位置至少一个球的方案数等价于在a个球的空隙中插b-1个隔板,因此为。由于原始数组中每个数都为1,那么操作等价于将1变为0,然后看剩下的一些位置中如何放球。由于a.b都不大,因此可以做。注意用递推计算逆元.最小值实际上可以计算导数,将复杂度降为。从0到100模拟一遍位置最小的点。
2023-11-20 15:44:31 67
原创 AtCoder ABC154
cap表示搜索是否被限制,当之前搜索的数字比s小时cap=0,否则cap=1,开始时cap=1。函数是从(0,0)到(r,c)点的所有组合数的和。pos表示当前搜索到的位置(开始为0,结束为n)1.每个(r,c)点上的数都是一个组合数。签到题,注意大小写和以前的不一样。num表示已经使用的非0数字个数。2.可以用容斥原理将ans拆成。将g按列分解(行也一样)签到题2,用个窗口即可。数位DP(搜索)的例题。
2023-11-14 19:29:43 89
原创 AtCoder ABC152
比如下图中有两个constraint,原题求满足所有的限制的方案,需要枚举每种黑色放置的方案,很不好做。如果反过来求不满足限制的方案,即在某些限制路径上全填白色,求总的方案数,那么就比较好做。所以最终不满足任一约束的方案数是2+2-1=3个,因为三条边全取白的方案在0b01和0b10中都计数了一次,因此按照容斥原理予以减去。由于不同的限制路径下边的集合会有交集,因此需要使用容斥原理计算。在这种情况下,不满足条件的方案只有1个,就是三条边全取白。f(1)=2,因为边2可以取两种颜色,边0边1全取白。
2023-11-14 11:38:48 137
原创 AtCoder ABC150
单纯的kmp似乎没什么思路,但是如果将每个数组相邻的数进行异或操作,就变成了kmp模板题。原因是4折半后为2,导致求得的lcm可以被2整除,如6/2不为半数。中,第一部分贡献1,第二部分分别由前面的数字贡献了1+1,因此是3;这部分仅仅和前面的那一位相关(当然这一位也要填1),因此贡献值是。我们可以将其拆成两部分,第一部分是“只要填了1就可以贡献1”中,第一部分贡献1,第二部分由第一位1贡献了1,因此是2.看第3位,他对答案的贡献是3+2+1+2=8(从上往下)比较巧妙的计数方法是将每一位的计算拆开来。
2023-11-10 17:45:04 89
原创 AtCoder abc148
需要找到T能“躲藏”的最长路径,也就是da[i] > dt[i]的i。A只需要等待在前一个格子让T遇上A即可。首先对每个点分别求到A和到T的最短路径。记为da与dt数组,接下来稍微要动一下脑子。trailing zero只与5的个数有关,因此算一下5/25/125…
2023-11-08 15:31:19 112
原创 AtCoder ABC146
在队列后面插入,如果当前的数据比队列后面的数据要小,那么那些排在前面的就没有必要维护了(因为前面的肯定比当前数据先出队列)比较暴力的方法是维护一个堆,但是不知道为什么一直RE,卡在第3个handmake点上。题目比较简单,点出度最大的度数就是颜色的种类,从该点开始搜索。注意遍历到当前时有长度限制。维护一个单调递增的队列,队列头是。BFS不好写,还是要用DFS。于是改成了单调队列的方法。是单调递增,因此二分。
2023-11-07 11:26:37 78
原创 AtCoder abc 144
元素两两相乘的积很明显的应该从a正序,b倒序进行相乘,此时可以保证L最小。如果不满足性质,那么将a扣掉份额。最后累计要扣掉的份额,计算是否满足题目需求。N=600下,枚举每条可能删的边会超时。但是由于只需要删一条边,因此针对每个点,只可能是它期望值最大的子节点和它之间的那条边被删掉。当你看到求数组某函数最大值的最小值,并且毫无头绪的时候,就应该想到二分。求数组元素的两两相乘积最大值不能超过L的解法,并求L的最小值。分两种情况,一种是水比一半面积少,一种是水比一半面积多。体积和面积是等同考虑的。
2023-11-03 14:46:01 86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人