自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 Codeforces Round 1016 (Div. 3)

第一个询问我们用dfs传此时我们确定的这个数所在行列的范围,和这个范围中的最大值,通过比对目标格数的行列和目前搜索范围的行列关系锁定田字格的方位,下一步搜索,直到范围为1。第二个询问同理,通过比对这个值和最大值的关系锁定在田字格的方位。二分通过k次分组使得每个组都能出现至少一次0~mid。上下界为0和n-1,判定时不需要map,因为需要判定的数的大小仅考虑在mid以内即可。由于给出了所有字符的长度小于2e5,那么直接暴力判断是否可行,再找到最大的匹配数的神经网络的匹配数t,答案就是n+2*(n-t)

2025-04-10 20:58:42 207

原创 Codeforces Round 1009 (Div. 3)

我们很容易想到f[l][r]代表顺时针l到r间的点的最大得分,再加上枚举顺时针l到r间的三个点,时间复杂度来到了n的五次方,显然还得优化。其实枚举l和r左右端点时可以等价于枚举那个三角形的两个点,在转移过程中找最大值。在一个由1x1组成的矩形,将小正方形合并为大正方形,小正方形的四条边所在的坐标必须是二的整数次幂,问最少剩下多少个正方形。我们可以枚举正方形的边长,从小到大枚举,并判断横纵做多放下几个,因为合并的正方形的原料一定是上一级合并成的大正方形,那么减少的正方形数量就是新和成的正方形数量*3。

2025-04-10 11:40:27 192

原创 Codeforces Round 1000 (Div. 2)

问题转化为在数组a b上删数,每次可以选择一个数组删去上面的两个点,差值累加,并删去另一个数组一个点,问对于每次操作的最大累加差值是多少。随着i的增加,sa递减,而sb递增,由此可见答案单峰,用三分即可在log时间内判断出每个x的最大值。在一棵树上删除两点,使得这棵树的连通块最多。深度搜索遍历这棵树,记录此时遍历的所有点的最大的度数,和最大度数点的数量。然后每遍历一个点就假设这个点作为第二个断点,此时如果之前最大的度数的点不是唯一且是父节点,那么答案就是两者加和-1,否则-2。

2025-04-07 21:57:48 215

原创 Teza Round 1 (Codeforces Round 1015, Div. 1 + Div. 2)

假设答案是i,那么对于0~i-1这i个数至少出现了m+1次,那么答案就是n/(m+1),每组从0~n/(m+1)-1,n/(m+1)个数 构造的答案为 0 1 2 .... n/(m+1)-1 0 1 2 .... n/(m+1) .....左端最小的数一定是全部最小的,找到全部最小的数,如果存在和它相等的数即合法。此时我们要拿m个k长的区间去删这m+1个循环,如果k的长度小于等于序列中每个循环的长度,那么我们每次删无法删掉两个一样的数,即每次只能覆盖掉每个数最多一次,那么删m次后,每个数至少还留下一个。

2025-04-07 20:00:55 250

原创 Educational Codeforces Round 177 (Rated for Div. 2)

给你每个字母出现的次数,要求构造一个字符串包含所有字符,且相同字符要不全出现在奇数位置,要不全出现在偶数位置,问共有多少种构造方法。可以根据奇偶数位最多/少的字符数量和当前的总字符数量确定每层j循环的上下界,然后算出此时的奇偶位置是否放得下第i种字符。对于每次修改,实际上就是找到这个位置上的数x,再找到对应的a[x]判断是否等于最初的那个a[x],不等则把这个a[x]当作x再次搜索下去。被搜索到的位置类似于并查集,处理完其中任何一个位置,其他位置就都处理完了。就是位置-数-位置-数的过程。

2025-04-06 16:46:38 171

原创 Educational Codeforces Round 172 (Rated for Div. 2)

b比a多的得分=s1*0+s2*1+.......+sn*(n-1),s代表这一段中b比a多的数量。这里s的处理可以想到用前缀和来,于是得到(s1-0)*0+(s2-s1)*1+(s3-s2)*2......+(sn-sn-1)*(n-1)=-s1-s2-s3.....+sn*(n-1),这里还是没办法确定n的值,毕竟sn*(n-1)很难确定。预处理出所有位置的后缀和降序排序,大于k停止即可。

2025-04-03 18:14:17 120

原创 Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)

可简化为:选择一个点,使得这张图存在另一个不在这个点的子树上的点的权值大于这个点且另一个点的值最大。我们需要在O(1)的复杂度下找出一个点除这个点的子树的最大权值。先找到这棵树的前序和后序序列,前序序列的前缀和后序序列的后缀组成了我们需要找到的。用两个前缀数组维护即可。如果不考虑翻转,那么最多操作n-1次,考虑翻转就是每次做差分操作之前考虑是否翻转,对和的影响就是差分之后变为相反数。我们只需模拟每次差分操作,算和与和的相反数即可。

2025-03-29 18:48:05 241

原创 Codeforces Round 1013 (Div. 3)

f[i][j][0/1] 表示ij位置的方案数,0表示这一排只挑了1个,1表示两个。s[i][j]表示目第i行前j列的方案数和。转移时,我们先转移0,由上一排符合臂展范围的s相减直接得到,此时更新这一排此时的s,再计算1的情况,用刚才的这一排的s直接得到,再更新一遍s。发现只有当a*k=b时(k为质数),F(a,b)=k才符合。反证法,将a b分解质因数出现1次以上一方有而另一方没有,或者一方比另一方多的情况都不符合。

2025-03-27 19:12:39 159

原创 Codeforces Round 1011 (Div. 2)

首先贪心分析会吃掉n/(k+1)盘寿司,倒数第i盘寿司最晚吃的时间是n-i*(k+1)+1,最早吃的时间是1.相当于在n个数中选择n/k个数,倒数第i个数的选择范围是(1,n-i*(k+1)+1),且每个数只能被选择一次,使得选择的数的总和最大,因为前面的选择范围更小,我们从前往后选,用线段树找到该范围下最大的寿司的编号,累加,再把这个寿司改成0。观察式子发现如果(x+k)xor(y+k)中的xor发挥的作用和+一样,那么左右两边相等,即x+k和y+k的二进制下的1不出现在同一位上。

2025-03-25 19:57:01 236

原创 Codeforces Round 1003 (Div. 4)

如果这个序列有两个一样的数挨着或者中间只隔一个其他的数,那么这个数就是多数。可以用反证法,构造一个多值序列无法不包含以上两种结构。只需要在树上找这两种结构就可以了。先分解质因数,可以构成半质数的有:两个不一样的质数,两个一样且有两个质因数的数,一个质数一个有两个质因数其中的一个和前面的数一样的。

2025-03-25 16:54:26 126

原创 Codeforces Round 1012 (Div. 2)

一个桌子四个座位,t=0肯定会坐左下角的那个。首先建立两个小根堆q1代表左下角的座位,q2代表一个桌子的左下角被坐后同桌子上其他的座位。当t=0或者此时被坐左下角的座位所在桌子的其他座位已经被坐完了或者q2的距离最近的座位的距离小于q1的距离最近的座位时,坐q1,否则坐q2。构造题,看起来很复杂,其实要求很宽松。首先一个数如果是质数,那么把这个数排在第一位,后面依次排-1,+1,-1,+1,可以使得每隔两个c都是质数,而如果这个质数在n/3~n/3*2的范围内,这个质数最多可以达到n/3个,恰好符合题意。

2025-03-24 22:36:35 241

原创 Codeforces Round 1010 (Div. 2, Unrated)

我们把这个数转化为二进制。得出一个结论最后结果无论向上向下取整的顺序结果最多差一,为p或者p+1,p是n的二进制数删掉后n+m位,是否+1取决于是否有一个m操作能找到n+m位之前的0。把x当作二进制数,根据B结论,操作的步数只有可能是n或者n-1(m指n的二进制位数),取决于次高位有进位的概率,我们设第i位进位的概率为f[i],答案化简就是n-1+f[n-1]。f[i]=f[i-1]/2 (c[i]==0) f[i-1]/2+(1-f[i-1])/2 (c[i]==1)注意中间有可能减为负数,要+mod。

2025-03-19 17:06:48 274

原创 Educational Codeforces Round 176 (Rated for Div. 2)

f[i][j]代表x去掉i位,y去掉j位后最小代价。f[i][j]=min(f[i][j],f[i-k][j]+1<<k,f[i][j-k]+1<<k),把这个当当作预处理,然后枚举x和y分别去掉了几位,判断剩下的是否相等,如果相等代入f值找最小。注意不一定x和y尽量去最位答案最小。把x和y转化为二进制,除以2的k次向下取整的操作转化为去掉二进制的后k位后的其他一模一样。先排序,二分找到ai+aj>=n,注意算的时候a必须小于n,这样才能保证配对时另一个大于0。打的最离谱的一场,全错在特判。

2025-03-18 22:47:23 193

原创 Codeforces Round 1008 (Div. 2)

我们发现本题难点在于新加进去的数应该和输入的都不一样,再观察范围,输入的数在十的九次方内,而新加入的数在十八次方内,由此我们想到可以把进加入的数构造为序列中最大的数。这个题给出的式子我们不要化简,a1=a2-a3+a4-a5...,我们构造a4-a5为负,之后的每组都是负的,再使得a1或者a2为最大,就可以使得a2最大,a2为我们新加入的数。x不相等时,把s给大的一方,这样之后的s比给小的一方多一个s,就算把s给大的一方之后可能造成的这个门确定的人数减少,到s会补去。一个x一个+原因同理。

2025-03-13 19:57:54 173

原创 Codeforces Round 1004 (Div. 2)

如果一个序列不包含0,那么符合。假设序列中有一个0位置为k,那么当k<=i<n时,一定符合,仅考虑当1<=i<k的情况。比较一个不包含0的序列在它的不同位置放0,我们发现左端的0的情况一定不会比右端的0情况差。当i>=q和i<p时两序列等价,考虑p<=i<q,此时左端0的情况一定符合,而右端0的情况不一定符合,故我们只需考虑最左端的0即可。考虑进位那么下一位进的1就会和这一位减少的1抵消,除非出现下一位为0的情况,这是这一位可减少1,下一位每隔九次轮一回为0,于是只有当这一位为8答案才有可能小于9。

2025-03-10 22:31:55 199

原创 Codeforces Round 1005 (Div. 2)

预处理f[1][1-30]=1,求f数组的时我们先假设在这一位置上的最高位为0,于是有f[i][j]=f[i-1][j],然后考虑这一位置上的数,先求它二进制的最高位bit,就有f[i][bit]=i,状态转移f[i][j]=max(f[i][j],f[i][j+1],当位数大于bit的,他的值继承了i-1,小于的继承了它上一位的,也就是f[i][bit]。考虑贪心,一个正数我们选了,那么所有排在他前面的正数一定也选了,一个负数我们选了,排在它之后的负数一定也选了。考的其实是动态规划。

2025-03-07 20:20:20 259

原创 Codeforces Round 1002 (Div. 2)

再思考假如数i作为MEX,那么它一定不会出现在前缀和的i-1个后面,也不会出现在前面,所以就在i-1的位置。我们找每一行最多到第几列满足前缀和的第i个=i-1即为p[i],将他们从小到大排序,枚举到第几个数的p[i]<i的即可。可以理解为求从初始点到目标点的最小花费,目标点就是点A在两个图中都与相同的点相连。分情况,n等于k时一个一个判断即可,n不等于k,尽量让开头不符合,找第二组数开头的范围[2,2+n-k],哪个不等于1就作为开头,如果没有就是全等于1,那么第二个数就不符合。

2025-03-05 21:41:22 163

原创 Educational Codeforces Round 174 (Rated for Div. 2)

美丽序列的格式只有可能是12.....23,想到可能用动态规划,以1和3作为对象研究发现转移困难,故想到以2为研究对象。f[2]表示此时12...2序列的个数,新加入2后12...2序列数量可以由三部分组成:原来此序列数量 原来此序列后面加2后的数量 2和前面1的数量。先将序列两端相等的去掉后,操作序列一定是此时序列的包含最左或最右的左段或者右端,以左端为例,发现序列长度越大,越有可能符合,答案具有单调性。二分序列长度,判断时分操作序列长度是否小于序列总长度两者情况即可。

2025-03-04 17:25:44 186

原创 Codeforces Round 1006 (Div. 3)

每一次查询的参数是要判断第n行第l个数到第r个数中哪几个为0,以第几行的数为三角形最顶点,此时就可以找到第n行中哪几个数是属于倒三角的0,然后搜连续的0的左边和右边即可。rev(n,p)=n0*p+n1=p*(n%p)+n/p,有以下公式。第一个式子可以用等差数列,n/p的加和,后面俩个式子枚举p的左端点l可以直接求出n/l=n/r的右端点。1.n<p<=k,此时rev(n,p)=n,一共有k-n个,总和为(k-n)*n。

2025-03-03 20:37:36 147

原创 Educational Codeforces Round 175 (Rated for Div. 2)

num[i]表示以这个点结尾能形成的路线数,dis[i]表示以深度为i的点结尾能形成的路线数,由此推出:num[i]=dis[d[i]-1]-num[fa[i]],dis累加即可,特殊处理深度为1和2的点。需要注意的是,每一步加法操作都需要取模,而减法操作如果出现负数,需+mod。最大值最小考虑二分答案,还有就是本题对n个格子涂色的检验难度很小。

2025-03-02 16:10:08 236

原创 Codeforces Round 1007 (Div. 2)

看l范围大概率是二分l来写。首先,可以发现当i为偶数时,a[i]=a[i+1]。再结合异或的性质:两个相等的数异或和就抵消了,可以想到求a[x],如果x/2<=n,直接跑一遍就行,x/2>n时,当x为奇数就-1,此时a[x]=a[1]^a[2]^......a[n]^a[n+1]^.......a[x/2]=P^a[n+1]^.......a[x/2],如果n为奇数,a[n+1]^a[n+2].......抵消了,故如果不是奇数,我们就求出a[i+1]令n++,凑成奇数。

2025-03-01 20:23:20 170

原创 Codeforces Round 998 (Div. 3)

先考虑A的删边,因为并查集不支持删边操作,我们考虑将A的边选择性添加代替删边,每添加一条边就查询两点的连通性在B中是否成立,成立添,否则不添,添边再开一个并查集。设序列的a[i]>a[i+1],此时必须通过操作a[i-1] a[i]才会使的序列有可能符合不递减。操作完a[i-1]为0,此时a[1~i-2]必须全部为0才能符合,由此,必须操作a[i-2] a[i-1],操作完a[i-2]为0......由此发现必须从a[1] a[2]开始依次操作,完成后判断是否非递增即可。

2025-02-26 09:21:43 170

原创 Codeforces Round 996 (Div. 2)

拿乌鸦位置和每个稻草人比较。如果乌鸦位置小,则稻草人尽量往左移动,如果时间够移动到乌鸦位置就让稻草人到乌鸦位置,乌鸦到原位置+k。如果乌鸦位置大,则稻草人尽量往右移动,如果时间够移动到乌鸦位置就让稻草人到乌鸦位置,乌鸦到原位置+k。否则稻草人移动到原位置+t,乌鸦移动到稻草人位置+k。前n-1行和为0,则前n-1行的m-1列的值和前n-1行第m列的值互为相反数,前m-1列的n-1行的值和前m-1列第n行的值也互为相反数,从而得出第n行所有值和第m列所有值的和相同,此时a[n][m]就有确定值。

2025-01-14 10:14:10 111

原创 Hello 2025

将选中的三个数转化为为二进制形式,第i位有一个或者两个是1是对答案的贡献是2*2^i。我们从最高位找到上下界不一样的第一位,此时下届为0,上届为1,这一位前面的数固定对答案无影响。我们令0后的数都是1,1后的数都是零,这两个数肯定在范围内,且从第i位到第0位都是仅会出现一个1,在随便选一个在范围内且不等于上面两个数的数即可满足每一位有一个或者两个1。

2025-01-13 20:07:55 152

原创 Educational Codeforces Round 173 (Rated for Div. 2)

将ddd...d拆成111...1*d。能整除有两种情况,第一种d能整除1 3 5 7 9。第二种用111..11除以1 3 5 7 9发现k位能除尽,则阶乘n中包含因数k就成立。需要注意的一个点是有可能时d中的一个因数乘n的阶乘的因数能整除1 3 5 7 9。将这个数组段分成三部分,即仅包含特殊的数左,右,和包含特殊的数。前两部分的最大知道最小值中每个数都能取到,取并集。再将这个集合的左右边界和第三部分的左右边界比大小输出。

2025-01-12 19:46:35 266

原创 Good Bye 2024: 2025 is NEAR

先考虑不修改的情况,不妨设一对位置(i,j)其中i<j,a[i]<a[j] b[i]<b[j],列举a[i]和b[i],a[j]和b[j]的四种大小关系发现,如果交换b[i]和b[j]的位置都会使结果变小,则a和b按递增(递减)排序的结果最大。问题在于如何让旧序列的数和新序列的联系起来,因为输入的是旧序列的编号。我们保留旧序列,输入序号时用旧序列的值二分找到新序列对应的数,再在新旧序列里的这个数都加1即可。每一层的点所代表的长度的范围相同,左右两边对称,故每一对加入的幸运值为定值为n+1,第一层特判。

2025-01-09 16:55:22 191

原创 Codeforces Round 995 (Div. 3)

最后的卖的价格一定是n个a和b中的一个,枚举所有a和b,然后判断不满意度是否

2024-12-23 01:41:18 490 4

原创 Codeforces Round 994 (Div. 2)

存在p在s左边的情况肯定非法,此时p全部在s右边,假设存在一对xsxpx,xsxp由1~pos(p)组成,此时sxpx像满足条件必须使sxp由1~L(sxp)组成,则只要x存在就需要L(sxp)+1的数,而这个数在最左边的x出现了,矛盾。不妨设a[x]=0,之后x+1~n~x-1按1010排列,n为奇数和x左边相邻是0,所以改a[x]=2,此时x与y的朋友关系无任何影响。当n为偶数不考虑x和y序列成立,考虑x和y不相等无影响,相等改a[x]=2即可。

2024-12-22 01:22:24 338

原创 Codeforces Global Round 28

b中难度<=a[1]的全部赋成无穷,因为此时的a[1]能解决其他人也能解决,都能解决=都不能解决。我们统计出来每道题有多少人能解决c[i],这些能解决的人数就是排在a[1]前面的。c从小到大排序,连续的k个一组即可。有一个序列肯定是原序列,高位的优先级最高,我们尽量让高位的0变成1,1不变。找之后连续的0对上(1,p-1)中连续的1,1不够就确定l为1,否则连续的0变成1优先和原序列最高位的0匹配,之后我们无法保证。假设一个数中有连续的33,表示出来,再去掉33表示,相减,发现差可以被33整除。

2024-12-21 19:13:10 272

原创 Codeforces Round 993 (Div. 4)

直接看图,总之就是预处理三个二维前缀和。原序列的二维前缀和sum,原序列*这个数从左往右从下往上第几个前缀和s,原序列*行数的前缀和ss,然后经过一系列加减运算就行了。和G1一样,但由于每个点可容纳多个玩具,此时计算和环相连的非环点为根构成的不含环上点的树的最大的含点量就可以了。把i和r[i]看成点,连边,构成一张图。其中环的部分就是最后稳定的部分,计算连在环上的树的最大深度+2即可。算X的约数对,并统计这些约数对是否存在。

2024-12-17 21:37:35 200

原创 Codeforces Round 991 (Div. 3)

将原序列转化成差分序列远序列l,r mod 吗相等转化成差分序列l,r-1的公约数为m,求m最大值,即在线求一个序列一段的GCD。可以用线段树写,但复杂度为qlognlog( ) 可能会超时。因为只有询问无修改,ST会更快,O(1)就能查找。连通块的数量就是在树上找一条边,边上的端点的度-1,其他点-2,之和。跑到点x时存在两种情况,x的两个子节点的子孙作为端点,还有x的一个子节点的子孙和x的祖先作为端点。a mod c == b mod c可以转化成abs(a-b) mod c ==0。

2024-12-13 20:01:49 209

原创 Codeforces Round 992 (Div. 2)

发现1为最小出现4次,2为最小出现3次......即m为最小出现n+1-m次,考虑构造这样一个序列,依次将1-n填入n个空位中。发现要满足此规律必须将需要填的数填入空位的最左或最右端,按字典序排列优先在左边,k与2的幂比较,k大则将对应的数填到左边再减去,否则右边。2的幂与数的对应关系是1 2^(n-2) 2 2^(n-3) ......从左往右覆盖,每次可以覆盖的长度是左侧连续的1的个数*2+2,每覆盖一次的最右端必须进行一次操作一。观察一个长度为n的全排列的S值最大的全排列(以n=4为例)

2024-12-10 15:53:36 324

原创 多维度线性DP及其记忆化搜索的转化 例题 GNYR04H - Mr Youngs Picture Permutations及动态规划状态转移的两种形式

这道题的重点在于多维度状态的转移。我们用a1a2a3a4a5表示每一行已经安排的学生人数,就是当前的状态。我们只关心此状态下的方案数,此状态可以推导出每一行在不超过限定人数和前一排的情况下的增加一人的方案数。这里值得注意的是:在动态规划的状态转移中有两种形式,一:如何计算出一种状态,即这种状态怎样有前一种推导 二:一个已知的状态应该更新哪些后续阶段的未知状态。前者更常见,但有时比如这道题后者更为适用。

2024-08-04 17:51:30 229 1

原创 2024 ICPC National Invitational Collegiate Programming Contest, Wuhan Site基础题K I B F E

当n%4==2时,序列为0001 0010 0011 ....... xx00 xx01 xx10,先手如果去xx10,则回到情况二,先手败,去0001,后手去xx10,此时0010 0011 xx00 xx10恰好异或和为0。这道题用二分写,具体不说了(主要不会)通过列举一些二进制数可以发现一个规律:0~3,4~7,8~11.....,以4为周期的二进制数的异或和为0,此时n可以分解成三个部分,0001 0010 0011 ....... xx00 xx01 xx10 xx11。

2024-07-21 10:27:43 1916

原创 字典树的两道经典例题:最大异或对 最长异或路径

根据异或的基本性质不难发现,x到y的异或和就是x到根节点的异或和异或y到根节点的异或和,求出所有节点的异或和,从高位插入字典树中,再从高位查询,和上道题一样,遇到不一样的就走。模板题,从最高位开始建立01字典树,查询时也从高位开始查,贪心思想遇到不一样的就走,没有就走一样的,就能保证走完的路径是这个数能组成的最大异或和。

2024-07-13 11:29:36 311

原创 字典树详解及对memset的思考

这里着重说一下空间的问题,首先trie数组第一维是点的数量,第二维则是字符的种类,由于这里的字符包括大小写字母和数字,而这些字符的ascll码是分散的,直接-‘0’使用会浪费很多空间使得超内存,这里需要做一下处理。还有每一组测试数据的初始化我都用了memset,memset的时间复杂度取决于你定义里面数组的空间大小,由于本题的空间先对较大,memset会超时。而精准的判断上一步用过哪些数组则省时的多。字典树是一种实现字符串快速检索的多叉树结构,trie的每个节点有若干个字符指针,这里可以理解成边。

2024-07-11 19:23:04 251

原创 离散化和map的相通之处及应用

电影语言字幕和人懂的语言的种类最多3*N,因此,我们可以将它们映射到1~3*N的实数范围内,先将N和2*M个数放入一个数组中,再将这个数组排序和去重。此后,它们将以排序去重后的次序代替原来的数据。我们在查找原来的数据是由1~2*N的哪一个数代替,只需二分即可。如果电影的语言对应的实数的范围不大,则可以开一个桶,依次扫描每个人会的语言,以语言的编号为数组的下标累加。用map更简便,只需开一个从int映射到int的map,key代表原人的语言,value代表这种语言懂的人数,查找时直接map数组查找即可。

2024-07-06 17:36:03 587

原创 离散化详解

离散化是排序算法的一个基本应用。离散化就是把无穷大集合中的若干元素映射到有限集合中以便统计的方法。有些时候问题的范围虽然是Z但是只涉及到m个有限值,并且数值的绝对大小无关,此时可以把整数集合中的m个数与1~m建立映射关系。原本时间空间复杂度与Z大小有关的算法就可以降为与m有关。此后,我们查找i(1<=i<=m)代替的数值只需返回b[i],查询a[j]被1~m哪个数替代只需再b数组中二分查找即可。

2024-07-05 18:45:36 196

原创 快速排序的讲解和排序算法时间复杂度的一个bug

我们现在一个序列(标号是l~r)中随机找一个基准元素,比如可以找序列中的第一个数a[l]记为x,然后扫描这个序列,遇到比x小的放入数组b中,和x一样大的放入数组c中,比x大的放入数组d中。因为我们每次基准元素找的都是第一个,那么b序列没有数,c序列只有一个数,d序列有n-1个,那么需要循环n-1次,每次平均扫描n>>1个数,时间复杂度退化到n*n。前者为O(n*n),后者O(nlongn)。第三类则是使用按按位划分,位映射的思想来排序,此时时间复杂度不仅和n的大小有关,还与元素的值的大小有关,局限性较大。

2024-07-05 18:03:14 314

原创 树上的差分详解及模板题 P3128 [USACO15DEC] Max Flow P

以本题为例,节点x和y之间所有的节点都增加1可以转换为节点x和y加1,x和y的公共祖先减2。相当于把x到y当成一个区间来操作,统计时只需算子树和即可。此题比较麻烦的是公共祖先节点要单独分类,在单独开一个数组记每个点当了几次公共祖先,统计时再加上这个值就可以了。树上的差分,顾名思义就是将原本数列的差分操作改成了树上节点和边的差分操作,利用到“差分序列的前缀和就是原序列”的重要性质将树上的操作简化。即区间操作转化为路径操作,前缀和转换为子树和。

2024-06-28 19:20:51 244

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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