自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Even Split_CodeForces - 1666E分析与解答

现在考虑ans_n=l>=c_(n-1)+min和ans_n<=d_(n-1)+max是否成立:先看后者,计算d_i的过程和二分时摆放max的过程其实是一样的,所以d_(n-1)+max一定等于ans_n,又因为c_i+min<=d_i+max。ans_i取[c_i,d_i]和[红,蓝]的交集,情况有如下两种,第一种可以取ans_i=d_i,第二种可以取ans_i=蓝。设a_i与a_(i+1)之间的分界点为p_i,定义c_i,d_i,表示p_i的区间范围:c_i<=p_i<=d_i,

2025-05-22 21:20:08 139

原创 Chord Crossing_abc405分析与解答

若在一轮询问中给出点a和b,记直接覆盖点a的线段是a1,直接覆盖点b的线段是b1,(这里,点被线段直接覆盖,关系和线段被线段直接覆盖类似),则树上从a1到b1的路径中除lca(a1,b1)外的节点对应的线段都满足覆盖了a,b中的一个点而没有全部覆盖,如果用倍增法计算出lca(a1,b1),也知道每个节点的深度,就可以在log(m)时间得到答案:dep[a1]+dep[b1]-2*dep[lca(a1,b1)]线段 i,让节点j当节点i的父亲,如果没有线段直接覆盖线段i,线段i的父亲是节点0。

2025-05-21 20:08:16 276

原创 Rhythm Game_agc072分析与解答

这里有一个关键观察:如果先执行了某个ddl靠后的任务,则ddl靠前的任务一定被释放,证明:执行完ddl靠后的任务 i 的最早时间是T_i+X_i,而ddl靠前的任务 j 的释放时间是T_ j - X_ j <= T_j + X_ j <=T_ i + X_ i。当完成一个任务 i 后,比i的ddl靠前的任务都被释放了,除此之外的是比i的ddl晚的任务,顺利完成任务也就是在所有任务的ddl前分别完成他们,那么应该先去执行比 i 的ddl靠前的任务 j1,j2,j3...经过时间 (cost) :2X_i。

2025-05-21 14:39:59 324

原创 Path to Integer_ABC402分析与解答

对于a_i,j,其一定在最后结果数的第(2n-i-j)位(如果将最低位看成第0位),故将a_i,j看成a_i,j * 10^(2n-i-j),这样每次加上a_i,j就可以了。考虑怎么降低复杂度,使用分治策略降低搜索的复杂度。复杂度上限估计:NlogN。

2025-05-09 19:04:18 175

原创 栈内存不足导致递归时栈溢出的解决方案

来设置栈内存为256MB。

2025-04-17 16:23:55 97

原创 洛谷P5633最小度限制生成树

满足以上条件时,在将集合x并入集合y的时候,将一个代价差:val[x]-w(w是边u-v的边权)放入数组b中,这个代价差表示,不把集合x(连通块x)连向集合y(连通块y),而是将集合x连向s点,产生的代价变动,前提是val[x]不是inf,也就是连通块x能连向s。在构建最小生成森林时,一般的kruskal直接将点u所属集合x并入点v所属集合y,现在我们为了让最终的最小生成森林里的连通块与s连接的边权最小,每次合并集合的时候,让val[y]<=val[x],如果不满足,就交换x和y让这个条件满足。

2025-04-16 15:09:04 133

原创 AquaMoon and Chess_CodeForces - 1545B

10 的情况,红色的“11”与0换位置,变成1011,可以看成蓝色的“11”到了0的后面,蓝色“11”和0的相对位置改变了,而第三个“1”是被动的,他起到了完成蓝色“11”和0换相对位置的桥梁的作用。由110变成011,由011变成110,“11”的组合和0可以交换位置。因此,单独的“1”起到了交换“11”和“0”的桥梁作用,其自身是被动的。那结果就是C(a+b,a) a是"11"组合的个数,b是0的个数。0 的时候,红色的1让“11”可以与最后一个0交换相对位置。

2025-04-02 21:27:04 142

原创 不等数列_洛谷 - P2401

A(n,k) : n的排列中有k个a_i < a_(i+1) 的排列数目。题中所求的就是上升数。

2025-04-01 12:35:35 163

原创 排列计数_洛谷 - P4071

先在n个位置中选好m个位置,然后剩下的数放在剩下的位置,但是放的时候不能有任何一个数放在了自己对应的位置上如果剩下了x个数,那么问题相当于x个数是从1,2....x,1不能放在第1个位置,2不能放在第二个位置,依此类推。

2025-04-01 12:08:44 171

原创 Lucky Chains_Educational Codeforces Round 139

先来看看怎么计算每个数的最小质因数spf[i],这些数从1到n,初始时,所有数的spf都是0,使用筛法,从i=2开始遍历到 根号n,如果当前spf[i]=0,则说明这个数没有被他的最小素因子筛过,也就是说这个数就没有素因子,是一个素数,将这个数i的倍数:i 2i 3i ... 的spf都设置成i,如果spf[ i的倍数 ]不等于0的话不设置,因为这个数已经被最小的质因子筛过了,当前的i是这个数的质因子但是不是最小的。题目给出一组(a , b),求能让a+i和b+i互质, 0<=i<=k,最大的k是多少。

2025-03-30 20:45:11 338

原创 食物链 POJ - 1182分析与解答

如果要建立x和y同类的关系,只需要检查x-A和y-B在不在同一个集合中,x-A和y-C在不在同一个集合中。如果要建立x属于y的关系,只需要检查x-A和y-A在不在同一个集合中,x-C和y-A在不在同一个集合中。每次创建关系的时候,不知道x和y具体属于(ABC中)哪一类的,可以把x和y可能的类别情况对应的关系。比如说,现在要创建x吃y的关系,就合并x-A和x-B,合并x-B和x-C,合并x-C和x-A。要创建x和y属于同类动物的关系,就合并x-A和y-A,合并x-B和y-B,合并x-C和y-C。

2025-03-30 16:41:00 173

原创 Okabe and Boxes_CodeForces - 821C题解

例如 入栈:3 1 5 4,之后需要第一次出栈,整理后变成 5 4 3 1,则1出栈后,3,4,5的顺序已经符合出栈顺序,此时如果入栈一个2 ,变成 5 4 3 2,然后迎来第二次出栈,2出栈后,剩余5,4,3是符合顺序的,如果现在再出栈3次,那么这三个元素顺序一定正确。这里就有一个关键观察,在完成一次排序之后,栈内当前的所有元素的顺序已经变得符合出栈顺序,所以这个时候可以直接将栈清空。所以在出栈的时候,如果栈是空的,则说明当前需要出栈的元素已经在栈顶。

2025-03-29 10:03:26 204

原创 NRE AtCoder Regular Contest 085

一开始让a的每一个元素都为1,那么之后,如果当b[i]=1时,将a[i]改成0,则(a,b)组合由(1,1)变成(0,1),价值增加了1,当b[i]=0时,将a[i]改成0,由(1,0)变成(0,0)价值减少了1。将区间按照左端点从小到大排序,设计状态dp[i][j](j>=i)表示前1~i个点a的值已经确定,第i+1到第j个点为1的情况下,如果j=i,那么第i个点后没有连续的1的段,前1~i个点贡献的价值。(3)是dp[i+1][从i+1到更大的数]被dp[i][从i到更大的数]更新。

2025-03-26 14:24:23 259

原创 Python Class 1

【代码】Python Class 1。

2025-03-25 09:32:31 73

原创 Lazy Narek CodeForces - 2005C分析与解答

如果选了,则枚举选了这个字符串后,开头的字符是什么(n a r e k依次枚举),从这个字符串第一个出现选定的开头字符的位置开始,往后查看"nareknareknarek...."序列,如果找到了k将价值加10(每个字符串价值初始为0),最后停在字母 j 上,则dp[i][j]可以被:dp[i-1][ j在narek中的上一个字母 ]+当前字符串的价值+cost[i]更新。dp数组计算方式:对一个字符串 i,如果不选,则dp[i][j]=dp[i-1][j],j依次是n a r e k。

2025-03-23 10:40:31 207

原创 AtCoder - arc086_d Shift and Decrement分析与实现

如果现在把操作次数统计为p_0+x+p_x,这样会用更多的次数完成相同的操作,这里有一个关键点,根据上面的p_0被累加的方式,p_0的二进制表达中1的个数是真实的p_0到p_(x-1)的操作次数的和,例如p_0 = 11011010,这代表着在p_0被增加前,p_0=0 p_1=1 p_2=0 p_3=1等等。当p处于某一区间时,为让所需操作次数减少,应该让p的二进制表达中1的个数尽量少(求一个区间[a,b]中的数的二进制表达中1的数目最少的数的方法见后)

2025-03-21 22:05:11 900

原创 AtCoder - abc138_f Coincidence

y%x的结果一定小于y/2(证明忽略),那么如果y的2进制位上是1的最高位中最高的一位(以后简称最高位)和x的该位不同的话,y^x后该位的结果是1,则y^x的结果大于y/2,所以y的最高位和x的最高位一定相同,则x>y/2,则y<2x,那么y%x就转化成了y-x。从第pos位到第1位,lim1:是否满足x>=L,lim2:是否满足y<=R,lim3:是否满足x和y的最高位相等,情况下的总情况数。以上三种情况是可以的,如果某位上y是0,x是1,那y-x后该位是0,但异或该为是1,结果不相等。

2025-03-13 19:15:07 242

原创 洛谷P10576 [蓝桥杯 2024 国 A] 儿童节快乐

(x-y)(x+y)=20,240,601,000,枚举两个因数中较小的那个,也就是x-y,通过(x-y)和(x+y)相加相减消元来解出x和y,但是通过消元解出的x和y不一定满足x^2-y^2=20,240,601,000,(也可能y^2-x^2=20,240,601,000)需要验证这个式子成立,还需要(x+y)是偶数(这个可以通过写出n的表达式,由n是整数推得)设x^2=n+10120300500 , y^2=n−10120300500,x>y>=0。答案:37044368843012180000。

2025-03-13 16:59:41 434 1

原创 洛谷P10582 [蓝桥杯 2024 国 A] 最强策略家

一开始,A可以下两颗子,起初棋盘上很空,棋与棋之间距离大,B只能挡住一颗,随着回合数的增加,B能覆盖的正方形范围越来越大,B能挡住的棋子的数目在某一回合x 后会大于等于2,之后A就不占优势了,没法让棋盘上的棋子的数目增加。第x+1回合,A还能再放两个,因此答案+2,答案不能超过棋盘填满时其上的子的数量。

2025-03-13 16:36:44 197

原创 The Wedding Juicer POJ - 2227

2.如果新点的高度小于当前点:则新点储水(当前点的高度 - 新点的高度),首先,这么多水一定可以存,因为当前点的高度是边界高度中最小的,其次,这是能存的最多的水,因为再多就超过了当前点高度,所以这个点能储存的水,在这种策略下,是所求的最大解,将储水结果累加进ans,并且将这个新点的高度改成当前点的高度后,标记新点坐标已访问,将新点加入队列中。采取从外层边界,一步一步向内部拓展的策略,具体来说,一开始将最外面一层的点加入队列,并标记这些点的坐标已经被访问。不断重复以上操作,直到队列为空。

2025-03-08 22:45:20 358

原创 Apple Tree POJ - 3321

这样就实现了,将节点与节点之间的包含关系,转化到了线段区间上。

2025-03-07 14:39:34 195

原创 洛谷P2290 [HNOI2004] 树的计数 分析与解答

涉及到一个数学知识点:prufer定理。

2025-03-04 21:20:05 278

原创 AtCoder Regular Contest 060 Digit Sum

对下面程序细节的一些补充:通过实验枚举所有的b发现,s>n不可能实现,s==n只有当b>n时能实现,更改一些循环的枚举顺序是为了加快速度。

2025-03-03 14:12:54 222

原创 AtCoder - arc101_d Robots and Exits

然后还有一些实现的细节技巧,两个机器人的x_i=x_j,y_i=y_j,这种情况只算一个机器人,因为坐标范围很大,可以将点按照先x小后y大的方式排序,这样使用动态规划数组dp[h],h代表点的y坐标,每次更新dp[h]=dp[h1]的和(h1<h)+1就可以保证x_j<x_i并且y_y<y_i,然后因为h坐标也很大,所以将h离散化后实现求前缀和,以下的程序用线段树实现,用树状数组也可以。好的,以上实际上是铺垫,关键的步骤是将x_i y_i和x,y放入平面直角坐标系中,接下来的内容用手写的方式展现。

2025-03-01 13:21:43 308

原创 洛谷P4018 Roy&October之取石子

若n是6的倍数,n=6^x=2^x * 3^x,有两个质因子,不能写成对于单一的p的p^k的形式,先手拿完一次后,剩余数量不会是6的倍数,如果剩余数量n1<6,那么后手一次拿完后手胜。1,2,3,4,5都能取,发现6没有办法取,猜测是不是和取的石子数量在1到m间一样,若总石子数n%(m-1)==0,则后手胜,其余情况先手胜,此时若n%6==0则后手胜,否则先手胜。若n=6,6不能写成p^k的形式,所以先手只能拿1到5个,后手胜。证明:若1<=n<=5,则先手一把拿走,致胜。

2025-02-27 13:02:52 230

原创 洛谷P1450 [HAOI2008] 硬币购物

dp[s-c[i]*(d[i]+1)-c[j]*(d[j]+1)],加上之后,有哪些情况被重复算了,哪些情况被少算了,如果再从直观角度理解(或通过韦恩图理解)就不是很方便了,根据容斥原理,每次加或减的集合中的元素个数如果为奇数,则加上,偶数,则减去,所以,三个物品都取超的情况。

2025-02-26 15:49:50 160

原创 洛谷P8815 [CSP-J 2022] 逻辑表达式

现在的思路是:将中缀表达式转成后缀表达式,用上述介绍的方法求后缀表达式的值,但是,实际上,求后缀表达式值的时候所用顺序和刚才介绍的方法不同,求后缀表达式的值是先建立表达式树,然后再从根开始递归计算,因为这样可以利用短路减少运算。后缀表达式的计算方法:建立一个栈,从左到右遍历后缀表达式中的元素,如果是数字,就将其加入栈,如果是运算符,从栈顶取两个数进行该运算符对应的运算,将运算结果加入栈,最后栈中剩下的唯一一个元素就是表达式的值。比如0 1 0 | & 1 1 | 1 0 & | |

2025-02-24 15:05:36 362

原创 AtCoder - arc101_b Median of Medians 分析与解答

通过观察,将这个区间的数不降序排列后,如果区间内大于等于x的数的数目(区间中数的个数为n)大于等于(n-[n/2]),则该区间的中位数大于等于x。这样处理后,求一个区间的和可以通过前缀和快速计算,给定区间端点l和r,如果pref[r]-pref[l-1]>=0,则这个区间的中位数大于等于x。将一个区间中的数分成两类,大于等于x的数令其为1,否则令其为-1,则当这个区间的数的和大于等于0的时候,这个区间的中位数大于等于x。比如 1,2,3,4,5中,x=3是满足三个数(5-[5/2])大于等于x的最大x值。

2025-02-16 21:57:51 362

原创 洛谷P2602[ZJOI2010]数字计数 分析与解答

用dp[i]表示从000....0到999....9的i位数(例如,i=3,就是从000,001,到999)中,一个数出现的次数(由于0到9这十个数字地位等价,他们出现的次数是一样的)则dp[i]=dp[i-1]*10+10的[i-1]次方,这是由分类讨论得到:例如 999 ,先看后两位 当最高位为0-9(共10个数)的时候,后两位从00到99,出现了子结构,所以出现的次数是10*dp[i-1]再来看当最高位等于需要统计个数的数的时候,例如,需要统计的是9,则900-999共有100个数,在这100个数中

2025-02-16 18:29:37 693

原创 AtCoder - arc058_d Iroha Loves Strings解答与注意事项

2.如果有一个字符串用完了,可能出现这样的情况:abc abc,这时应该先选前面的“abc”,因为选完编号为i的字符串后,新入选的字符串的下标从 i+1 开始,如果选了第二个或后面的,就会有字符串没法被用到,从而导致丢失解或错误解,新入选的字符串(编号为 j )要满足dp[ j+1 ][ k-i-新字符串的长度 ]等于1,这样选其能确保最终构成的字符串有可能长度为k,将pair<新字符串的编号,0>加入sel中。dp[i] = dp[i+1] | (dp[i+1] << s[i]的长度)

2025-02-13 21:18:54 375

原创 洛谷P2127序列排序 思考与解答

首先,交换次数最少是k-1次(不介绍证明方法),具体方法是每次在环中选一个数,让他与环中的每个其他数都交换一次,例如1-->4-->2-->3-->1,选取1,先后交换:1和3,1和2,1和4,三次交换后即有序,要让每次交换的代价都尽量小,应该选取环中最小的数和其他数交换,这样,交换次数最少,每次交换的代价也最少,最后得到的消耗最小。1-->4-->2-->3-->1 这个环表示:将数1换到4的位置,将4换到2的位置...将3换到1的位置。将排序后的数列记为b,排序前的数列记为a。

2025-02-09 20:50:56 194

原创 洛谷P3960 [NOIP 2017 提高组] 列队 分析与思考

这道题独特在需要自己设计一个能够完成特定操作的数据结构而不是直接套用现有的数据结构每次将一个数取出,若这个数的坐标是(x,y),这个数右边的数要全部往左挪一个,最后一列,第x行以后的数要全部向上挪一个这样挪来挪去,往后考虑就不太好有思路了这样划分这个数的阵列:C(R0)R112345R2678910R31112131415R41617181920其中R表示row行,C表示column列。

2025-02-08 00:22:24 329

原创 AtCoder - abc089_d Practical Skill Test 分析

所以可以由 i (i : 1~D) ,计算出从i 到 i+D ,i+2D ....的花销,直到 i+nD>HW。令L不断减去D,令R不断减去D,直到结果小于等于D,最后得到的是同一个数(因为R是L加上一些D得到的)将每个 i 到 x的花销,记作 dp[x] (叫pref前缀和可能更合适)此时的复杂度:因为每个数值只被计算一次,所以 HW 为复杂度。答案可以计算成:dp[R]-dp[L]最后得到的数在1-D之间。

2025-02-07 14:50:17 118

原创 洛谷P3586 [POI 2015] LOG Logistyka 分析与解答

进一步,如果数的个数超过了c,但是贡献的格子数量的最大值大于等于了c*s,说明在简单情况的c*s网格中,每一行的c格中,有一些格子被替换成了原本的c种数以外的数,替换后,与同行相比,因为是c种数以外的数,所以不会有与同行中的数种类相同的数,所以不会出现重复。现在问题转化为,每一个数有一个贡献值,这个贡献值是数的值,但最大是s,如果所有数贡献值的和加起来(此时得到的是最大贡献值),大于等于了c*s,就可以满足取数要求。大于等于s的数的总和好解决,大于等于s的数的数目也好解决,两者都使用树状数组正常更新。

2025-02-01 01:14:32 620

原创 C++大整数类

使用结构体实现高精度加减乘除运算,但是除法运算的复杂度较高,(其实乘法也是),更优的方法涉及到数学方法,在此没有采用,参考《算法竞赛入门经典第二版》加减乘除均为模拟列竖式的过程。

2025-01-30 01:38:58 196

原创 洛谷P6242线段树3代码解释

因为线段树更偏向实现过程的解读吧,我就把解释写成注释了。

2025-01-22 22:04:44 209

原创 洛谷P1025数的划分

初始情况(边界情况):当情况为0个球,0个盒子时,表示所有的球都放完了,所有的盒子都用完了,是一种合法的方法,dp[0][0]=1。dp[n-1][k-1],将一个只有一个球的盒子里的那个球取掉,剩下n-1个球,剩下k-1个盒子。从每个盒子中取出一个球,剩下n-k个球,和k个盒子,方法数为dp[n-k][k]状态转移方程:dp[n][k]=dp[n-1][k-1]+dp[n-k][k]将问题看作:把n个球放入k个盒子,每个盒子至少有一个球,有多少种方法。用dp[n][k]表示方法数。

2025-01-21 19:00:41 115

原创 Anya and Cubes分析

对后一半物体进行搜索,最多需要3的13次方时间复杂度,然后得到后半部分的物体的和值,以及当前的使用阶乘的次数,那么,前一部分的和值就是总和值S减去后一半物体的和值,前半部分的使用次数加上后半部分使用阶乘的次数应该小于等于k。因为后半部分涉及到遍历前半部分符合条件的次数,所以应该减少后半部分的搜索花销,若有n个物体,前半部分负责1到n/2+1的计算,后半部分负责n/2+2到n的计算。对前一半的部分,计算出和值为sum,使用次数为used的状态,有多少种选择情况能达到。

2025-01-21 18:36:11 307

原创 joker(AtCoder - agc044_b)分析

每次有一个人离开,这个人的坐标是(x,y),意味着其上下左右可能有人,通过(x,y)离开的怒气值比当前这个人的怒气值小,而新的这个怒气值减小的人,其上下左右的人中,也有可能有人通过这个新的人离开, 会让自身怒气值减小,如此反复,直到没有人的怒气值能够被减小。使用occ[x][y](0-没有被占据 1-被占据)表示这个点有没有被占据,使用h[x][y]表示这个点的怒气值,则其周围的点通过这个点离开,其怒气值为occ[x][y]+h[x][y]:其h[x][y]被全局变量初始化为0,因此不可能被考虑。

2025-01-21 18:07:14 333

原创 Olya and Energy Drinks分析

题目链接。

2025-01-21 17:46:30 363

空空如也

空空如也

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

TA关注的人

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