- 博客(33)
- 收藏
- 关注
原创 洛谷P8733 [蓝桥杯 2020 国 C] 补给 (floyd+状压DP)
则前一次状态为i-(1<<j),枚举前一次状态最后一次经过的点(用lowbit巧妙得到1的位置),状态转移方程:dp[sta][i] = min(dp[sta][i], dp[lst_sta][x] + d[x][i]);最后用dp[sta][i]+d[i][0]更新答案,因为最后还要回到起点。例如D=4,i到j距离为5(超过D设为inf),i到k为3,k到j为3,则我们选择从i到k再到j,d[i][j]=3+3=6。首先用floyd得到d[i][j],表示i到j的最短路径,想清楚为什么要用floyd!
2025-03-25 20:59:07
150
原创 蓝桥19748 再遇白骨精【算法赛】(状压DP)
注意到n的范围是10(很小),对每一列0/1的组合可以用状态压缩表示。dp[i][j]表示第i列,状态为j的方案数,从i-1列转移,dp[i][j]+=dp[i-1][lst_j],其中状态j和lst_j相同位置上的1的数量大等于k,采用f(x)函数统计x中二进制1的数量,即f(j&lst_j)>=k。统计时借助lowbit运算,最后累加答案即可。先简化一下题意:n*m的方格,要求每一列至少有k个,满足该位置和下一列的该位置是1,求总方案数。
2025-03-25 18:11:40
215
原创 P1750 出栈序列(贪心)
注意一点,之前无脑认为0x3f3f3f3f是INF,实际只有1e9那么大,而int类型2e9多,所以mn初始值。:如栈为空时的处理;还有min(n, p + re - 1)。不能赋值成0x3f3f3f3f。
2024-11-08 22:58:25
223
原创 P1044 [NOIP2003 普及组] 栈(搜索dfs/卡特兰数)
考虑dfs,一个信息保存数列中剩余的数,还需一个信息存栈中的数(便于判断第一种情况)。2.有元素时,选择输出或插入。1.当栈中没有元素时,只能插入。
2024-11-03 16:41:09
222
原创 Catalan数
三种公式如图片所示,1式的证明在图片中(已经很清晰了),2式就是数学处理1式推导出来的,一个2n的01序列,0和1的数量均为n,满足任意前缀中0的个数都不少于1的序列的数量。4.即为图片所示问题:(0,0)走向(n,n)不超过对角线的路径数量。1.n个左括号和n个右括号组成的合法括号序列数量Catn。2.1-n序列经过一个栈,形成的合法出栈序列。3.n个节点构成的不同二叉树数量。
2024-11-03 16:12:05
158
原创 P1005 [NOIP2007 提高组] 矩阵取数游戏(区间DP+高精(int128))
从边缘取数,容易想到区间DP,f[i][j]表示取完数后剩下[i,j]区间的数未取,此时的最优值,状态转移也十分好想。高精度,用__int128处理(不想手打高精。(类似快读快写,不能用cin,cout)。每行的结果独立,对每行分析。
2024-11-03 14:18:12
177
原创 P1004 [NOIP2000 提高组] 方格取数(四维DP/三维)
我们不妨两次路径同时考虑,f[x][y][k][l]表示第一次走到(x,y),第二次走到(k,l)的最优解,状态转移从四种方案中选择(第一次向下/右,第二次向下/右),再加上(x,y)和(k,l)的权值,注意如果这两个点相同,只加一次,因为走了一次已经被取走了,这样就可以保证后面的结果不会出现重复加的情况。如果只走一次,显然是DP, (二维DP),f[i][j]表示走到(i,j)时最大权值,但是DP一次只能求得最优解,不能记录走了哪些格子。一个地图,走一次之后权值被取走,再走一次,求两次之和最大。
2024-11-03 00:27:24
170
原创 P1080 [NOIP2012 提高组] 国王游戏(贪心+高精度(包含高/低模板))
,若1和2要交换,需满足max{a0/b1, (a0*a1)/b2} > max{a0/b2, (a0*a2)/b1},同时约去a0, max{1/b1, a1/b2} > max{1/b2, a2/b1},注意到1/b1 = 1/b2。只需满足a1/b2 > a2/b1, 即a1*b1 > a2*b2。所以我们按照a*b升序排列。联想到排序算法中cmp比较函数,也是按照某种规则比较两个量,这里我们也分析两个。套上高精度乘法, 高精/低精除法模板。
2024-11-02 19:56:10
295
原创 P3373 【模板】线段树 2(加,乘懒标记)
当乘上一个数时,要将他的add标记也乘,这样下传标记时直接加上就可以了。用两个懒标记记录加(add)和乘(mul),注意mul初始为1。
2024-11-01 22:06:44
236
原创 P10463 Interval GCD(线段树)
对于序列a[i],它的差分数组b[i]=a[i]-a[i-1],查询区间[l,r]的gcd,即gcd(a[l], b[l+1],b[l+2]...b[r]),第一个a[l]很重要,后面的都是根据它来的,因此我们还得求得a[l]的值(区间加,单点查询,联系到树状数组模板,c[]维护序列a的差分数组,求前缀和即为a的值),然后线段树查询区间[l+1,r]的gcd。线段树维护差分数组,使区间加变成两次单点修改,再加一个查询gcd操作即可。题目简化:区间加(联系到差分),查询区间gcd。
2024-10-26 21:04:47
218
原创 AcWing 245 你能回答这些问题吗(线段树)
难点在于维护这个子段和,线段树每个节点要保存:总和s,包含左端点的lx,包含右端点的rx,最大连续子段和ans。用struct结构保存线段树节点,注意编号p<<1|1,不要写成p<<1+1。单点修改和查询区间最大连续子段和。
2024-10-26 16:47:14
215
原创 P10497 [USACO03Open] Lost Cows(树状数组+二分)
倒序开始,第n头牛编号确定,为a[n]+1,那么[1,n]区间中a[n]+1这个值已经被取走了,对于第n-1头牛,他的编号是去除a[n]+1的1到n之间的数中第a[n-1]+1小的数,依此类推。建立一个01序列,初始为1,表示每个位置的数的是否被取走(1未取走),我们需要对这个序列查询第k个1的位置(二分这个位置,树状数组查询前缀和和k比较),取走之后将这个位置变成0。有 N头奶牛,已知它们的编号为 1∼N 且各不相同,但不知道每头奶牛的具体编号。操作:单点修改+查询第k个1。编号范围是[1,n],从。
2024-10-26 14:45:45
239
原创 树状数组梗概
对于[1,x]这个区间,可以分成logx个小区间,x表示成2的次幂的和(次幂递减),一个区间以R结尾,该区间的长度为lowbit(R),该区间表示成[R-lowbit(R)+1, R]。一个序列a,c[x]保存[x-lowbit(x)+1, x]区间所有数的和。拓展操作:区间增加,联系到差分,可以用树状数组维护差分数组,查询前缀和即可。3.除树根,c[x]的父节点是c[x+lowbit(x)]2.c[x]的子节点个数等于lowbit(x)的位数。1.c[x]保存以它为根的子树中所有叶节点的和。
2024-10-22 23:03:21
114
原创 P6033 [NOIP2004 提高组] 合并果子 加强版(桶排序)
首先O(n)排序,发现数的范围在1e5以内,可以进行桶排序,建立桶数组cnt[i],下标为数值,表示i这个数在该桶中出现的次数,最后按顺序插入队列q1就排序好了。对于这道题我们的做法是每次合并最小的两个堆,可以再建立一个队列q2,保存合并的数,每次合并操作从q1和q2两个队列中选两个最小的合并,累加答案即可。数据加强了,优先队列用不了,考虑O(n)的做法。
2024-10-22 22:51:09
458
原创 AcWing 106 动态中位数(对顶堆)
考虑对顶堆做法,上面是小根堆(储存比中位数大的元素),下面是大根堆(储存小等于中位数的元素),当枚举到第i个数时(i为奇数),要满足上堆有i-k个元素,下堆有k个元素(k=(i+1)/2),此时下堆的top()即为答案,简而言之就是在插入过程中满足个数限制,i为奇数时检查并维护此限制。依次输入一组数列,动态维护中位数。
2024-10-22 16:39:29
189
原创 P1631 序列合并(优先队列)
注意一个关键点:例如a[2] + b[2]可以由a[1] + b[2] 和a[2] + b[1]得到,所以我们需要规定一种扫描方法是答案不会发生重复,先只移动指针i,i不移动了再移动j,这样就可以保证不重复。当a[i] + b[j]确定为第k小时,a[i+1] + b[j]和a[i] + b[j + 1]加入第k+1小的备选答案之中,用。序列 A,B,在 A,B 中各取一个数相加可以得到 N2 个和,求这 N2 个和中最小的 N 个。维护所有备选答案之中的最小值。有两个长度为 N 的。
2024-10-21 22:50:13
241
原创 AcWing145 Supermarket(二叉堆)
我们的目的是让利润最大,新建一个小根堆(堆中的元素是卖出的方案),节点的权值是商品的利润,将商品按过期时间排序,枚举每个商品,若当前商品的过期时间=堆中元素个数,判断他是否更优,若大于,直接插入即可。超市里有 N 件商品,每件商品都有利润 pi 和过期时间 di,每天只能卖一件商品,过期商品不能再卖。求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
2024-10-21 19:43:03
131
原创 均分纸牌类型的问题和延申
枚举位置k,从k断开转化成问题1,重新统计前缀和,观察最后的表达式,即为货仓选址问题,找中位数即可。对每个a[i],先减去平均值,目标是将ai序列全部变成0,依次向右传递,推导答案易得。线性传递,相邻之间可传(首尾不相邻),一次操作可传递若干张牌,求最小操作次数。行和列互不影响,做两次环状均分纸牌即可。(注意开longlong)环形均分纸牌,p2512糖果传递。经典题:均分纸牌p1031。
2024-10-20 20:02:53
249
原创 p1496 火烧赤壁(离散化+差分)
一个区间覆盖,可以用差分实现,对于[l,r), 差分数组f[l]++, f[r]--,最终为0的区域就是未覆盖。,给定n个区间,求总长,重叠的部分不重复计。因为区间下标很大,考虑离散化。
2024-10-06 18:17:59
505
原创 AcWing102 最佳牛围栏(二分答案)
当我们二分了一个平均值,让原序列都减去这个平均值,判定是否存在长度大等于L的子序列和非负,即求最大子段和非负。sumi表示前缀和,观察表达式,随i增加1,j也增加1,故不需枚举j,只需用一个变量记录min{sumj}首先简化问题,给一段长度为n的序列,求长度大等于L的子段,他的平均值最大。考虑二分答案(因为平均值具有单调性),将求解转化为判定。
2024-10-06 15:20:01
256
原创 P1115 最大子段和
f[i]表示以ai结尾的最大子段和,易得f[i] = max(ai, f[i - 1] + ai).O(n)求解。扫描该数列,不断把新的数加入子段,当子段和为负数,清空子段,扫描过程中出现的最大值即为答案。
2024-10-06 14:02:35
413
原创 P1024 [NOIP2001 提高组] 一元三次方程求解(二分)
题目表明,根的范围在[-100, 100],两根差的绝对值大等于1,所以我们枚举每个长度为1的区间,二分求解,用零点存在定理判断是否有解。左端点l,右端点r=l+1,先判断左端点是否为根(不需判断右端点,因为下一次会枚举到),左端点不是根,则在开区间(l,r)进行实数二分。记录根的数量,到了3就可以结束。
2024-10-06 13:17:33
171
原创 AcWing100 增减序列(差分)
题目转化成:对于数列b1~bn+1, 每次选择两个数,一个加一,一个减一,最终使b2~bn变成0。区间加减操作,容易想到差分,最终要让n个数相同,则差分数组b2~bn变成0;先进行操作一,正负值(x, y)抵消后可能还会有剩余,然后选择操作2。可能的情况:即看最终b1的取值有几种可能,abs(x - y)+ 1。最小操作次数:min(x, y)+ abs(x - y)3.选择bn+1和2~n中的数操作。1.优先选择下标为2~n的操作。2.选择b1和2~n中的数操作。
2024-10-03 22:04:50
210
原创 前缀和(二维)
注意到n=120,数据很小,可以直接考虑稍微暴力的解法,枚举子矩阵的行数和列数,再枚举子矩阵右下角的坐标,复杂度n的4次方。二维前缀和模板题,坑点:坐标+1防止数组越界。范围变成(1,N+1)
2024-10-03 20:52:23
221
原创 AcWing96 奇怪的汉诺塔(简单DP)
先考虑n盘3塔的问题,有d(n) = 2 * d(n - 1) + 1。即先把A中的n-1个盘移到B塔,再把A剩下的一个盘移到C塔,最后再把B中n-1个盘移到C塔。在考虑n盘4塔的问题,有f(n) = min{2 * f(i) + d(n - i)} (1=< i < n)
2024-09-28 23:41:45
154
原创 Acwing97 约数之和(分治)
数学题,将A分解成质因数相乘的形式,可以得到约数集合,那么约数之和可写成多个等比数列。乘积,接下来问题就是如何求,考虑分治,复杂度O(log)
2024-09-28 23:09:48
157
原创 Acwing95 费解的开关(状压搜索)
思路:首先对第一排确定一种变换方案,将第一排固定,如果为该位置是0,通过变换第二排的该位置元素使他变成1即可,依次向下求得最优方案。,枚举0到31这32个数(2的5次方),二进制下1表示变,0不变。这里的变换是指一个元素本身和他的上下左右共五个元素异或1。枚举第一排的变换方案,每一个位置可选择变或不变,则考虑用。简要概括一下题目:有一个5乘5的01矩阵,通过。让其中元素全变成1,求最小变换的次数。
2024-09-28 16:24:52
224
原创 P2114[NOI2014] 起床困难综合症(位运算)
x1 < x0, 肯定填0(初始值更小且答案更大)。填0的条件:x1 = x0,答案一样, 要让初始值尽量不超过边界,故填0更优;填1的条件:x1 > x0, 且X加上后不超过边界值m。的, 对于初始值X,我们依次讨论他每一位填0还是填1。x0表示如果该位填0进行n次位运算后的值, x1同理。二进制的数进行位运算,每一位都是。运算提示可以用位运算解决。
2024-09-26 23:00:56
166
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人