- 博客(123)
- 收藏
- 关注
原创 牛客周赛 Round 41
首先dfs可以把这颗树分为若干个块,对于每个块我们要使其和为0,且绝对值和最大,那么我们有什么办法确定填多少正数和负数,首先明确和为0,那么正数和负数填的绝对值和应该相同,那么我们只考虑正数,我们肯定填的越多越好,具体如何快速实现呢,这里有一个不是很明显的二分性,我们二分正数的值,判断凑出这个值需要的最少个数,这个块里的其他位置可以填负数,也可以为0,check一下是否满足,然后就可以完成了。注意对于块顶点不是红色的,我们填绝对值较大的那一个。当然出题人好像有一种贪心做法,可以去看一下回放。
2024-05-09 15:31:09
287
原创 C:Jump and Treasure(单调队列优化DP+调和级数)
然后每次询问又给了限制,这里就用到了调和级数,也就是 n/1+n/2+n/3+n/4+...+n/n 大概在nlogn的级别,而单调队列优化DP 又是O(N)的,这样就可以看似暴力,其实稳过的a掉了。表示以 i 为结尾的最大得分然后枚举前p-1个位置,但是时间肯定不允许,可以想到这类题典型就是单调队列优化的;题意:给你一个0到n的柱子,一开始在0,需要跳到大于n的地方,每个柱子上有个得分,思路:一般很容易想到一个 n*p 时间复杂度的DP ,且限制了最大跳跃步数;
2024-04-17 18:45:40
419
原创 Educational Codeforces Round 164 (Rated for Div. 2)
我们考虑一个集合的贡献,如果最大值大于sum的一半,那么值就是max,反之值就是(sum+1)/2。那么我们可以sort a数组枚举最大值,同时简单计数dp统计 各个 总数量的集合的方案数。题意:给你n个颜色不同的小球,以及每种颜色小球的数量,让你求。种集合分割方案的价值和。
2024-04-15 19:42:38
494
原创 蓝桥杯2024年第十五届省赛
根据给的公式化简后变为gcd(a,b,c)然后我们对1到mx的树求约数,并记录约数的次数,我们选择一个最大的且次数大于等3的就是gcd。
2024-04-15 16:41:28
2333
原创 D - Coconuts HDU - 5925(二维离散化压缩)
思路:把不存在障碍物的行与列压缩为一行或者一列,然后存在的就不压缩原样记录,压缩后的就记录原来的行列大小,这样行列最大就300了就可以了正常dfs了。题意:就是给你一个图有多少连通块,按增序输出,但是图比较大需要离散化一下。
2024-04-12 16:40:22
195
原创 P1281 书的复制(区间DP+贪心)
然后我们倒叙枚举,每次都选取不超过全局答案的最大值,即可记录区间。状态转移那么仔细想一想,这题需要连续分配人。这里提供一份区间DP,
2024-04-11 18:12:28
210
原创 L3-1 那就别担心了(记忆化搜索)
一开始用的反向建边的拓扑,数量应该是没问题的但是,是否自洽还得正向dfs判断一下,不如直接记忆化搜索。这样两条边是不可以的。需要注意的是自洽的判断,如果起点是1,终点是3。那么1->3->2;
2024-04-08 11:26:44
252
原创 状态压缩DP
一般设表示状态下,为最后一个最值情况。一般有两种稍微不同的写法,单纯就是写法不同,思路方法都相同。第一个例题为第一种转移方法,有当前转移后面。后面的都是由前面转移目前。
2024-04-02 16:19:48
286
原创 A - Environment-Friendly Travel Gym - 102501A
题意:给你一些交通方式和站点,不同的交通方式碳排放不一样,问从起点到终点距离不超过B的路径中最少的碳排放是多少。思路:二维dijkstra,建图什么的倒不是很难,主要就是对二维dij的理解了;具体见代码(具体的dp思想还没想好)。
2024-03-27 15:14:04
226
原创 计数DP
f(i, j) =f(i - 1, j) +f(i - 1, j - 1) +f(i - 1, j + 1) 转移过来。表示当前点向上走i步且最终在第j列的方案数,我们知道我们每一步都要缩短短距离,也就是向上走,那么我们转移方程也就有了。思路:dx = abs(x1 - x2), dy = abs(y1 - y2), 那么最短距离一定是。,然后就是状态表示了,
2024-03-25 10:46:41
195
原创 经典过河问题
2:两个最大的一起过去:先让a[1]带着a[0]过去,再让a[1]回来,再让a[i]和a[i - 1]过去,最后让a[0]回来,每一次要花(a[1] + a[1] + a[i] + a[0])的时间。1:最快的人一个一个送:a[0]带着a[i]去去来来,每一趟要花(a[i] + a[0])的时间。2:让最快的人回来,然后让最慢于次慢的过去,然后次快的过来带着最快的一起回去。首先我们想,应该让最快与次快的先过河,然后让他俩来回的带其他人过河。1:让最快的回来,然后带一个人回去。其实也就是一个贪心题。
2024-03-20 20:31:17
423
原创 The 2023 Guangdong Provincial Collegiate Programming Contest
二分我们知道了,但是check里面如何判断才能配合二分呢,对于我们check的mid ,我们可以先按行排序再按列排序,然后按这个先行后列的顺序按我们的原图找0~mid-1的数,然后只看列是否满足即可,也就是上一个的列值小于等与目前的列值。嗯,怎么说呢,一般二维图,数据不是很大的比如n*m*log级别允许的,如果一眼不是bfs,可以考虑结合一下二分。本题可知,只能向下或者向右,那么我们就像如果答案为x,那么一定会有一条0到x-1的路存在,我们再想一条路肯定是先右再下,然后重复进行的,类似于一个楼梯的样子。
2024-03-18 20:59:24
386
原创 牛客练习赛122
正着求删除的最小代价不好做,采用逆向思维,求选择一些不相交的线段使得构成一个圆的代价尽量大,最后答案就是所有线段权值之和减去最大代价。很明显,离散化候不同区间值被拉近了距离,但是不相交得还是不相交,所以本题可以离散化。2、选择以为左端点的线段。枚举左端点 所能到达的右端点 v,权值为 w,那么当前的答案。本题的相交比较上一题有点不同,不同在包含的时候端点可以相交,而不包含时端点不可相交。具体的还是区间DP的过程,枚举区间长度 len ,枚举区间左端点 i 和右端点 j。1:不选择以左端点的线段,
2024-03-04 17:04:14
491
原创 2024牛客寒假算法基础集训营4
思路:看到数据范围差不多可以想到用来装压dp,一个比较重要的观察是,每次都从已经染色的点上出发画新线,就是最优做法了,每次都挑未染色的点连线,最后再连起来,画线次数不会比第一种方式少。那么这样每个时刻上色的点的颜色一定相同,所以我们枚举染色状态,染色点以及未染色点确定一条直线然后去跟新 新的状态。这里我们要预处理两点确定的这条直线上存在的点,叉积预处理即可,初始化每一条直线马,每一个点都初始化为1,其余都是无穷大进行转移即可。
2024-02-26 20:14:55
333
原创 2024牛客寒假算法基础集训营5
完全背包+加不少于的模型由于人数只有1000,那么 bi 实际有效的范围只有1000左右,并且,soyorin至少要花一次 p 的代价将消息通知给 1 个人,然后再让这个人去将消息通知给剩下的 n−1 个人。 那么问题就转化成了:将消息通知给 n−1 个人的最小代价,将消息通知给 bi 个人需要花费 ai 的代价,且 ai,bi 能用多次,也就是一个完全背包。注意一些细节。
2024-02-22 23:24:13
448
原创 Codeforces Round 926 (Div. 2)
假如资金无限的话,这种方法赢的期望为无穷大.原理类似于二进制,不论你输再多次,只要赢一次总额就增加了1.比如 15 二进制1111,前3把一直输,但是只要第4把赢,就一定可以增加 1 资金.1.第一种情况下因为每条链上只有一个关键点,那么经过 x 的路径一定不会包含第三个关键点, x子树的所有情况可以随意组合,直接将所有子树的 f 乘起来即可。2.第二种情况下,如果 x 的一棵子树存在这样一条链,其他子树的任意节点都不能成为关键点,只能是空白一种情况,所以把所有子树dp相加。
2024-02-16 17:19:51
1011
原创 Codeforces Round 925 (Div. 3)
思路:可以看出只有1,2可以改变图形的凹凸性,且必须交替排列,那么由此可以推出一种不能的情况,那就是abs(a-b)>1,无论如何交替都不可能,另一种就是ab都为0吗,但是3,4都存在这种也无解。仅有一种方案:以 1 开头。此时 3,4 均有 a个空位,方案数为 (c+a−1,a−1)(d+a−1,a−1)。此时 3,4 均有 a+1 个空位,方案数为 (c+a,a ) (d+a,a)。那么根据我们上面的不可能的条件,我们可以分为a==b ,a==b+1,b==a+1,三种情况。
2024-02-15 20:06:01
336
原创 2024牛客寒假算法基础集训营1
具体来说,我们枚举m的每一位为1的1,强制这一位为0,这样m被分为前后两部分,对于前面的部分一定要满足或后小于m,简单说就是,在前面m不为1的位绝不能为1,而我们令当前这一位1为0了,对于后面所有位都为1,也不可能大于当前这一位,那么我们就可以根据这进行枚举计算了。这题一看数据范围很大,重量和价值都是1e8级别的,当时还在想是不是背包,原来就是位运算。
2024-02-02 20:33:55
465
原创 AtCoder Beginner Contest 336 D - Pyramid
题意:就是给你一个长为n的序列,让你通过两种不限次数的操作 使其变为金字塔序列,(a1<a2<ak>ak-1>ak-2...>an)由于我们有a[4]的限制 ,相当于a[i-1]的最长序列就到 a[ 2 ],不论 a[2]是 1,还是2 ,3都会满足上式;1:a[ i -1 ]<a[ i] 这里到没什么特殊的就是和a[ i ] 这个限制取min。故状态转移方程就只有 dp[ i ]=min(dp[ i-1 ]+1,a[ i ] );由于我们可以使数减一,我们可以让a[ i-1 ]的最长序列 减 1。
2024-01-15 10:14:59
629
原创 Count the Colors ZOJ - 1610
思路:典型的线段树区间染色问题,一般这种题在(l , r) 区间有问题,比如这题我们正常做法就是把区间变为点,但是我们注意到 我们染色[ 1 , 2 ] 和 [ 3 , 4 ] 后 [ 2, 3 ] 这一段我们并没有染色,而我们当点处理这一段会被染色,还有一个问题就是染色区间为[ 0,8000 ], 0在线段树里我们并不能维护,所以我们在处理[ l , r ] 时右移 l ,变为[ l +1 , r ],这样问题都解决了。,我们可以用一个 pre 记录 前面的颜色,
2024-01-10 16:15:29
461
原创 Mayor‘s posters POJ - 2528
例如 [1 , 6] , [1 , 3] , [5 , 6] 离散化后会变为 [1 , 4] , [1 , 2] , [3 , 4], 这样一来,原来第一个区间就会被完全覆盖。线段树中的tag就相当于懒标记,它意思就是表示这个区间的数被修改了为同一个数,那么查询的时候,就不用下放了,因为我们是统计有多少个海报。这是因为,离散化操作让不相邻的点变得相邻了,这在普通问题中没有什么影响,但是在区间覆盖问题上就变得很关键了。(l [ i ] , r [ i ] )是否相邻没有什么影响。
2024-01-08 20:54:54
472
1
原创 “华为杯”杭州电子科技大学2023新生编程大赛---树
那么如何计算答案呢,就是用 f [ l ]~f [ r ] 分别异或f [ x ] 相加即可,但是1e5级别的询问显然时间复杂度不可以接受,然后我们就行有什么可以快速算出 l ~ r 的贡献呢,这时候就看思维发不发散了,这里可以想到用前缀和;那么答案就是,对f [ x ] 的每一位的贡献计算,比如f [ x ] 第2位是0,那么根据异或1异或0才有贡献, 贡献就是 pow( 2 , i (第几位) )*( sum1[ r ][ i ]-sum1[ l-1 ][ i ] );测试点包含多组数据。
2024-01-04 21:49:59
1033
原创 Acwing 5379. 旋转和翻转+Atcoder 332D - Swapping Puzzle
【代码】Acwing 5379. 旋转和翻转+Atcoder 332D - Swapping Puzzle。
2024-01-01 09:40:17
404
原创 启发式合并
启发式合并时间复杂度的简要证明:可以发现每次将小的集合合并到大的集合中时,小的那个集合的大小至少会变为原来的两倍,所以每个元素在集合之间的转移次数是 logn 级别的,同时利用swap交换近乎为O(1)的。
2023-12-18 21:13:42
428
原创 Codeforces Round 914 (Div. 2)
题意:我们给定两个长度均为n的数组a和b,我们可以进行的操作是,从a中选一段区间[l,r],将这段区间内的a[i]全部改成这段区间的最大值,问最后能否使a变成b。
2023-12-15 11:03:03
519
原创 E - Exam Study Planning Gym - 104790E
题意:就是给你n个考试,每个考试给你四个元素,分别为考试开始时间,进行复习后的交卷时间,没有复习的交卷时间,以及复习花费的时间,问最大通过多少考试。
2023-12-10 15:47:59
130
原创 字符串哈希(线段树维护)
这一种直接暴力维护的正反哈希,一个左高右低,一个右高左低,相比较于第一种做法多了一个快速幂的log( 注意取mod,不然会wa)我们这里是左高右低,故是hash[ l ]=hash[ l ]*p[ r.len ]+hash[ r ];这一种做法就和正常的字符串哈希基本思想一样,都是h[r]=h[l-1]*p[r-l+1];且注意要query要先递归右子树,以便于先维护出右部分的len。
2023-08-22 09:32:02
532
1
原创 P4178 Tree (点分治)
一:我们考虑树上两点之间的路径有什么情况1:经过根节点(即在根节点的两端)2:不经过根节点(完全在一颗子树的一侧)二:我们考虑这两种路径是否可以归为一类1:对于第一种的情况两点间路径长度dis( u , v ) 可以看为dis ( u , root ) + dis ( root , v )2:而对于第二种情况我们可以找到u , v 路径所在的子树,将根节点变为子树的根节点,然后就变为了第一种情况3:总之,所以我们可以不断的递归根节点将所有情况转化为第一种情况。
2023-08-12 14:42:48
256
原创 SDUT 2023 summer team contest(for 22) - 14
如果该连通分量中存在两个环,那么这两个环因为都没有出度,所以不可能出现由一个环出发走到另一个环的可能(除非相交,但相交就相当于一个环)因为所有结点的出度为1,该联通分量的的任意一个结点都有只有一个路径可走,假设路径A能走到第一个环,B能走到第二个环,路径A和路径B之间必然不连通,所以这两个环必然位于两个联通分量之中。如果输入2,代表路线连接的两个机场都需要建立,输入1,代表路线连接的其中一个机场建立(必须),输入0代表路线连接的两个机场都不可以建立,问你最少建立几个等候室;
2023-08-11 08:25:45
167
原创 2023 山东省大学生程序设计竞赛
从队列中取出一项工程后,我们会获得该工程的奖励。当工种为 t 的员工加入公司后,我们检查和工种 t 有关的人数最少的未满足需求。如果这项需求被满足了,则对应工程的要求数减一。要求数减少为零的工程继续加入队列。答案就是从队列中取出的工程数。复杂度 O(nlogn),主要是每次拿出“人数最少的需求”需要预先排序或使用堆等数据结构。我们维护每项工程还有几条要求没有满足,并将不同工种的要求分别维护。所有要求都被满足的工程将加入队列。本题类似于拓扑排序。
2023-08-09 16:06:51
507
原创 SDUT 2023 summer team contest(for 22) - 13
思路:我们根据其公式得知,我们得到其哈希值,要知道其牌号,和交易字符串,而这两个我们都不知道,那么我们其实可以只有构造一个交易字符串,在不加牌号得情况下求出其暂时的哈希值(mod1e9的意义下),但是我们还是不知道其牌号,其实这时候牌号就等于其变为后七位变为0减去其目前暂时哈希值(应为最终哈希值要后7位为0),这个操作可以通过令(x/1e7+1)*1e7得到后7位全为0得情况,减去x即为牌号,下一个构造同理。思路:如果一个连通块是一个二分图,那么只能染色二分图的一部;时间复杂度内计算出来。
2023-08-08 19:34:58
196
原创 SDUT 2023 summer team contest(for 22) - 12
0,前面先构造长度为m-1的a串(相似部分),后面考虑构造abab,acaca....azaz,bcbc,bdbd..bzbz,cdcd,这种方法共有25*(25-1)/2==300,正好满足题意。思路:我们知道Sn=Sn-1的前一半+Sn-1+next(Sn-1的后一半),next是求其下一位(z的下一位是a),我们可以知道当Sn的的长度大于2*m时,答案只会是其后缀的变换,题意:给你三个数,n,m,k,分别是需要构造的数量,最大相识度,每一个的长度。题意:你有 A个原料,每 B个合成一个产品。
2023-08-08 09:37:05
304
原创 C - The Battle of Chibi
① 既然要优化求前缀和的速度,不妨对 dp[1∼n][1] 构造一个树状数组,对 dp[1∼n][2] 构造一个树状数组,⋯,对 dp[1∼n][m] 构造一个树状数组。这样一来,我要求 dp[i][j]。就可以再dp[1~n][j-1]z这颗树状数组里求前缀和了,这样一个前缀和就可以在 O(logn) 时间内完成。1:可以想到状态表示dp[ i ][ j ] 代表以 a[i] 为结尾的且长度为 j 的严格单增子序列的数目,②再想我们用树状数组数组时要以a[i]大小为下标,故要离散化一下。
2023-08-07 09:15:42
434
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅