自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 快读,快写

【代码】快读,快写。

2024-11-03 12:09:38 121

原创 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

原创 P3372 【模板】线段树 1 (延迟标记)

区间修改,区间和查询。

2024-10-26 21:39:08 223

原创 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

原创 AcWing146 序列(序列合并plus,优先队列)

由两个序列变成m个序列合并,可以依次合并两个序列,一共合并m-1次,对最终的答案无影响。

2024-10-21 23:04:30 101

原创 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

原创 P1012 [NOIP1998 提高组] 拼数

字符串拼接问题,使最后的字典序最大,直接排序,定义比较函数cmp,按照拼接后字典序更大的顺序排。

2024-10-11 23:25:19 146

原创 高精度(模板)

P1601 A+B Problem(高精)

2024-10-09 17:56:28 136

原创 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关注的人

提示
确定要删除当前文章?
取消 删除