- 博客(237)
- 收藏
- 关注
原创 CF2283F[数据结构]
首先考虑一种暴力解法,当我们建好i之前的图后,当我们添加i的时候,区间[li,ri]中的点都会向i建边,但是这些点中,如果有某两个顶点l,r,满足l<r,那么l就可以通过r间接到达i,因此可以删除l到i的边;初始时我们令所有点放入set中,然后对于每一个i的处理,我们将集合中仍在[l,r]的范围的点弹出,并且将f设置为i,这样我们就得到了所有点的最小跳板;对于每个区间[l,r] 我们要计算这下下标中的f(v)中大于r的数目有多少个;我们令f(v)表示顶点v可到达的最小的顶点;
2026-11-10 13:26:31
8
原创 CF2283E[组合数学/贝尔数]
对于每个01交替块,我们要计算他们的划分数目,也就是把每个大小的连通块分为2和3的块有多少种方案,这个方案的计算可以利用dp:我们令dp[i]表示将大小为i的集合划分为2和3大小的块的数目,那么dp[0]=0,dp[1]=0,dp[2]=1,dp[3]=1;首先我们可以观察得到对于任意两个相邻的不同字符,我们可以选择他们使得f(m)变为2,对于01交替块,我们最多只能选择3个连续的元素,使得f(m)为2,任意大于3的交替块都不合法;前几项:b[1]=1,b[2]=2,b[3]=5,b[4]=15.
2026-11-10 09:41:25
25
原创 CF342E[暴力分块]
其次,对于任意两个点之间的距离我们可以通过lca在logn的时间内算出来,因此我们可以将查询分块为sqrt(m)个,对于块外,我们进行多源bfs,那么复杂度为sqrt(n)*块数,对于块内,我们进行暴力lca求解,复杂度sqrt(m) * sqrt(m) * logn;当我们有任意个红色节点的时候,我们都可以通过多源BFS在o(n)的时间内求出其他点距离最近的红色点距离;
2026-11-04 16:49:39
157
原创 CF2276F [博弈论]
当所有的环的大小都不超过K的时候,此时Alice可以直接染完每一环,那么Bob想要获胜必须要选择多个环并且只染色一个,然后让Alice无法一下补全所有已经选择的环,也就是选择一组共d个环,使得他们的总和至少为k+d+1,这个时候,我们染色d个,一定会有至少一个环Alice无法补齐。取完所有的非单点后,只剩下若干单点以及一个k+1的大环,那么可以看作巴什博弈,将大环也看作单点,但是拿到最后一个单点的玩家会输,因为后者可以直接补全,由于k最多为20 ,我们可以直接枚举先手策略,判断后续的博弈是否能够胜利;
2026-11-03 15:07:33
76
原创 CF547B[单调栈+贡献法]
如果考虑每个区间,那么复杂度为n*n 显然不可能,因此我们考虑一个点对区间的贡献,对于一个点,我们可以通过正反两次单调栈找到他的左侧和右侧的比他小的idx,然后我们就可以找到一这个点作为最小值的最大区间,然后对这个区间长度的所有答案取max,找到 所有长度为1到n的区间中,对于一个长度i,找到所有长度为i的区间中最小值最大的那个;最终显然长度更短的区间答案一定更优与长度更长的区间, 然后对答案取后缀最大值;
2026-10-20 10:57:01
60
原创 2020CCPC长春F[树上启发式合并+两两异或和拆位Trick]
我们维护子树中每个数字的数目,以及每个数字的每一位的1的数目,然后每当我们遍历到一个节点的时候,枚举这个点作为lca,我们需要找到两个子树中的点进行异或,因此当我们遍历一颗子树的时候,只能利用别的子树的信息而不能利用当前子树的信息,所以我们可以进行两次遍历,第一次遍历进行答案统计,第二次遍历将子树节点统计进去,而由于lca定值并且lca的权值我们需要知道,如果采用传统的dfs遍历,会导致我们还要传一个真正的lca参数,我们可以采用dfn序遍历,这样就会比dfs好写;这道题显然有这个特征;
2026-10-14 14:47:18
214
原创 CF2267E[01段反转]
上述考虑的都是向下取整,当sumb为奇数的时候,由于向上取整,这个时候的次数会+1,因此我们还要统计一下sumb为奇数的子串的个数,也就是cnt0*cnt1;根据题意,对于一个字符串来说,想让他在最小次数内变为干净子串,显然要计算出一个子串有多少个段数,然后选择其中0/1较少的段数,即 段数/2向下取整;这样b就可以作为是否为分段点,那么对一个子串来说sumb+1就是段数,也就是说我们需要(sumb+1)/2 也就是sumb/2向上取整次。=s[i+1]那么我们令b[i]=1,反之令b[i]=0;
2026-10-09 09:48:47
124
原创 CF2028E[树上概率dp+短链剖分]
显然,贪心的想,alice一定向自己的父节点走,而另一个玩家一定会向下方所有子树中,最深的子节点最小的那个叶子节点走,这样的话也就是一个短链剖分。对于这种向前向后都有可能的问题,我们可以设计DP状态为走到下一个状态的概率/代价。那么对于一个节点u ,他的答案也就是从u到1节点的dp乘积。如果是叶子 dp值为0,1的dp为1。
2026-09-15 15:39:53
158
原创 CF180C[期望的线性可加性]
对于每个节点,如果我们知道这个节点被选择的期望次数,那么根据概率期望的线性可加性,所有节点的期望之和就等于和的期望,那么这个结果就是所有节点被选择的和的期望,也就是操作步数的期望,对于一个操作序列,一个节点是否被选择取决与这个节点的祖先是否出现在这个节点之前,如果都出现在这个节点后面,那么就可以被选选择,那也就是1/dep。因此最终的答案就是每个节点的1/dep之和。设X,Y为两个离散的随机变量。
2026-09-15 10:50:47
199
原创 CF2035E
当a>=sqrt(2z)并且b>=sqrt(2z)的时候显然成立,因为我们要求最小值,所以应该使得二者尽可能小,当min(a,b)<=sqrt(2z) 我们就只需要枚举a和b分别到sqrt(2z),然后二分找到另一组数据;我们令d(a,b)表示a次操作一,b次操作二所造成的伤害,由于k次连续的限制,我们要把a分为k个一组,此时k=1,此时ab交替,最优解最后一次一定是操作二,也就是攻击,那么b>=a,c=a。我们考虑最难的情况,也就是k=1的时候,这个时候理论上最慢,因为我们增伤限制过强,
2026-09-08 09:42:50
208
原创 CF 208 E
在dfs序中 一个节点u的dfs序号 x到 x+sz[u]这个部分是u的子节点的dfs序号。所以我们按照深度 ,将每个深度按照dfs序排序,然后二分找到在父节点的子树部分的节点数目即可。可以简单转化为一个节点的k级祖先的k级儿子有多少个。这个儿子的集合种他们的深度一定是一样的;
2026-08-30 19:06:11
194
原创 CF2023D
由于w是存在上界的 ,而且根据我们的直觉,因为概率是累乘的,因此最终选择的物品不会很多,不然累乘后权重会很小。那么也就是说,每个p最多选择100/(100-p) 个元素最为候选。假设我们选择了c个概率为p的元素,那么设其中权重最小的为w_c。因此我们只需要每个概率的若干个元素候选,然后进行01背包即可。令DP[i]表示W为i的时候,可以获得的最大的概率乘积。对于同一个p,显然我们只会选择w最大的几个前缀元素。原来的期望为WQ 删除后为(W-w_c)Q/q;如果删除这个最小的元素。最优的时候删除不会更好。
2026-08-28 11:55:21
158
原创 CF2022E1/E2[DFS/带权并查集异或约束]
dfs的判断:从根节点开始遍历,如果遇到没遍历过的边,那么就是树边,遍历下去,如果遍历过 ,那么就是回边,生成一个环,此时我们需要判断这个回边的边权是否等于二者的路径异或,不相等就pass;若得到了k个连通块,每个连通块内部的根节点一旦确定 ,整个连通块就确定了,因此一个连通块就要乘2^30 ,也就是(2。因此我们可以看作n+m-1个节点在图上,对于每一个已知的点,都会建立一条i->j的为v的约束,k ,但是当所有的x和y同时异或一个值的时候,总的值不变 ,去掉这个重复的情况也就是(2。
2026-08-25 03:06:02
190
原创 CF1844E[二分图染色判定]
也就是说只要矩形的最左侧一列和最上侧一行确定了 整个矩形就是确定的。那么我们根据约束建立边之间的关系,然后跑一遍二分图染色判断即可。对于约束(x,y)(x+1,y+1) 显然会有dx!对于约束(x+1,y)(x,y+1)会有dx=dy;
2026-08-22 12:33:03
230
原创 CF598E[背包DP/记忆化搜索]
k 不超过30 * 30 * 50 种状态,所以我们可以枚举出所有状态;的矩阵中切出大小和为。的矩阵所需最小花费。的矩阵所需最小花费,记忆化后进行递归即可。
2026-08-16 21:07:40
223
原创 ABC468F[线段树优化DP/最长上升子序列]
给你一个正整数N和 (1,2,…,N) 的排列P=(P1,P2,…,P**N变量xyc.最初为xyc=0。对于这个顺序中的k=1,2,…,NxP**kcxxP**kyP**kcyyP**k求c的最大可能终值。
2026-08-11 11:56:05
211
原创 ABC468E[求所有子区间的平均数之和]
所有长度区间为m的子区间的平均数之和。f(l,r)为区间l到r的平均数。然后分别求一下所有的区间长度即可。
2026-08-11 10:55:00
35
原创 洛谷P10496[数论,同余,欧拉定理]
显然,如果10和9L/d不互质,那么一定不会余1,无解;互质的话我们枚举一遍phi(9L/d)的约数即可,然后快速幂进行验证。那么gcd(9L/d,8/d)=1,那么有。的最小正整数x_0是phi(n)的约数。一个数字只由8组成那么就可以写成。这个式子写成同余的形式就是。令d=gcd(8,L);若a与n互质,则满足。
2026-08-03 03:17:28
45
原创 Problem -CF105873H- Codeforces[概率期望状压DP]
我们用dp[mask]表示完成mask所代表的任务集合的时候的期望,tm[mask]为完成mask所代表的任务集合时的时间,我们可以发现,无论内部顺序如何确定,他们的时间时确定的,也就是tm[mask]是确定的,我们通过枚举不同的实现顺序,来实现使得dp[mask]最大化,而对于这一部分我们可以看作mask都是在他的子集pre上增加一个任务得来,也就是说。对于一个任务,如果我们在截至时间前完成了,我们就可以获得他的基础收益,如果获得了基础收益,那么我们判断他的完成时间与ly,ry的关系。
2026-05-26 20:12:35
55
原创 CF106531e
如果我们选择了两个垂直的街道,那么他们一定会有一个交点,代价和直接沿着边界走的代价一样,如果我们选择了两个平行的街道,那么他们的路径可以平移到一条街道上;对于这道题显然 如果我们选择了斜着的街道,如果他的方向是正确的,那么选择他会使我们的代价减少1 ,如果相反,代价增加1;计算每个街道在合法范围内可以节省的代价,然后取得base-代价的最小值。因此我们只考虑经过一条街道即可。
2026-05-19 21:58:28
40
原创 算法竞赛进阶指南 图论 最短路
图的存储: 对于有向图 我们一般有邻接矩阵和邻接表两种存储方式对于无向图 可以看作两条方向相反的有向边;邻接矩阵是一个空间复杂度n^2的矩阵定义:合法:a[i,j]=w[i,j] 超出边界:无穷值 i==j:0。
2026-05-19 21:53:08
416
原创 [专题]最大子矩形问题
在一个二维平面中 存在多个障碍点 我们要找到一个最大的矩形 使得这个矩形面积最大并且不能包含任何障碍点 这一类问题叫做最大子矩形问题对于不同的数据范围 和 图的类型 (密集图/稀疏图) 我们有不同的算法。
2026-05-19 21:52:26
543
原创 Problem - 2043E - Codeforces EDU173
对于矩阵中的某个位置 ,如果他为1 而最终的矩阵为0,那么需要进行 &0操作,相反需要进行|1操作,假设某一行,进行了行操作,某些列进行了列操作,那么行列之间就会产生交点,对于交点,如果这个交点最终为1 ,那么显然我们要先行后列,反之先列后行,就相当于建立了一条有向边,要严格按照有向图的顺序进行操作才能得到合法答案,因此找到所有的这种节点后,我们可以进行拓扑排序,判断操作顺序是否是一个DAG如果是,说明可以通过DAG的顺序得到合法答案,反之说明存在环,无法得到正确答案,
2026-05-12 23:05:37
59
原创 Problem - 2205D - Codeforces
所以我们可以用单调栈从左到右一次单调栈维护每个元素作为谷底时左侧需要删除几个元素。然后从右往左进行单调栈,维护每个元素作为谷底的时候右侧需要删除几个元素。最终的序列一定是单调递减或者单调递增或者一个谷形。最终两侧的值相加就是这个元素作为谷底的代价。
2026-05-02 17:21:34
44
原创 2024 CCPC吉林省赛[部分题解]
记T(pre,m)表示这一位为1,前缀有pre个1,后缀长度为m时,增加的贡献;或f[c+d-1]=f[c]*f[d]+f[c-1]*f[d-1]这道题我们考虑从高位到低位进行数位dp。初项A[0]=1 b[0]=0;那么有T(pre,m)=
2026-04-28 22:18:58
84
原创 CF EDU 177 D[组合数学+背包]
这道题显然所有相同的字符的奇偶性是一样的,那么如果存在答案,一定是一部分为偶数,一部分为奇数,且二者的数目合法,也就是和总数对应,并且所有的相同字符的奇偶相同,就像是背包问题,每个字符全选,总体积为奇数或者偶数数目,然后求所有的方案数;对于一种选择: 总方案数目= odd!对于一种方案,最终的方案显然就等于 奇数方案*偶数方案;显然对于每种合法选择 ,方案数时一样的。最终答案= 选择数 * 总方案数。(所有奇数方案中的字符数目的阶乘)奇数方案=总奇数的阶乘/
2026-04-27 20:41:48
52
原创 EDU 180 E
那么如果合并两种染色模式 方案数分别为i和j,点的数目分别为dp[i],dp[j],如果两者都保留根节点绿色 我们可以让他们的根节点相连接,一共有j*i种染色方式,如果其中一个变为黄色或者蓝色,那么这个子树的整个树都要变成同种颜色,然后挂在另一棵树的同种或者根节点上,新增加了2*(j)种方案数,因此我们有dp转移dp[(i+2)*j]=min(dp[(i+2)*j],dp[i]+dp[j]);对于一颗树,令父节点为u,子节点为v,显然以u为根节点的方案数就是。
2026-04-25 15:40:15
54
原创 CodeForces - 2157C
我们可以考虑一种环形的思路,从0到k-1 不断延长,那么我们选择任意超过k长度的区间,都一定保证会有0到k-1 如果mex区间中间套了小的min区间,这一段为k-1 ,但是由于有效长度一定是大于k的,那么原来的策略依然有效,只不过中间的部分被接替到环形后面了,这道题对于有min约束的数字,我们为了方便,全部设置为k,对于mex约束的数字,肯定这个去加不会有k,那么我们令他们全小于k,对于mex和min一起约束的数字,显然一定要大于k且不等于k,我们令他们等于k+1,即可。
2026-04-21 14:11:26
43
原创 Problem - D - Codeforces
这道题我们每次要选择一个长度大于等于k的区间,删除第k小元素,那么显然,对于整个数组的第1到第k-1小的元素,一定不会被删除,因为他们不会是任何一个子数组的第k小,因此只要不是这些数字,我们都可以删除,删除后,我们用双指针维护两端 ,如果相同就左右向中间移动,如果不同,如果其中一个是第k小的元素,那么我么那就删除 直到结束或者没有删除次数。
2026-04-20 20:12:55
41
原创 Problem - 2206H - Codeforces[数论]
对于相邻两项ax ax+1 如果反转1到x 再反转1到x-1 那么a1会增加2*(ax+1-ax) 由于a的变量至于相邻两项的差值有关,所以反转可能影响前面几项的值,但不影响相邻项的差的绝对值, 因此a的增量就是相邻项的差的二倍,首先,每次操作会选择前缀或者后缀进行操作,但是显然,操作前后,相邻两项的差的绝对值永远不变,由于最终单调不减,所以an的结果就是a1 加所有相邻两项的差的绝对值之和,因此只要最小化a1就可以最小化an。
2026-04-16 19:59:33
42
原创 The 2024 International Collegiate Programming Contest in Hubei Province, China(2024ICPC湖北省赛 部分题解)
用并查集建立连通,维护整个连通块周围的空位,如果整个并查集都没有气,那么就bfs整个并查集删除,删除的时候,这个位置会变空,重新计算进别的连通块的气中。题目给出的式子左右平方 a^2 *b=lcm(x,y)/gcd(x,y) 取a=1 b=lcm(x,y)/gcd(x,y) 最大;任意选择几个点,围成多边形,求最小的一个,显然三角形面积最小,暴力枚举所有三角形,用向量叉积计算面积即可;分类讨论,在a ,b, a的最小质因数 ,2, b的最小质因数,b这五个数之间运动即可;最后的答案就是平均数。
2026-04-15 16:52:01
104
原创 2024 ICPC National Invitational Collegiate Programming Contest, Wuhan Site(2024ICPC武汉邀请赛) 部分题解
我们假设时间为t的时候结束,那么很显然最优的点位就在时间为t的时候,谣言扩散到的子树上的直径的中点,当时间增加后,会增加一层的节点,每增加一个节点,对于原来的部分树半径节点(u,v) 增加x点 ,那么新的树的直径就在(u,v),(x,v), (u,x)中产生,我们遍历这一层的所有节点,然后更新直径,就可以得到这个时间,树的直径;对于具体选择哪个,我们要分别计算三种情况的距离,因此我们要有一种快速实现求树上两点之间的距离的算法,我们可以采用倍增LCA ,距离就是二者到LCA的距离之和。
2026-04-13 19:50:57
440
原创 Problem - 2149F - Codeforces
显然 假设我们一共休息了m次,如果想让用的代价最少 ,我们一定要将这m次平均分配到整个路程中,这样使得花费的代价少;假设平均分配后 分成了s段 则d/s 为每一段的长度a 但是由于向下取整,d%s个段会加1。2. 向右移动,减少健康值 如果连续移动j次 那么第j次的代价就是j;如果连续移动的t次 那么代价f(t)=(t+1)*t/2;大致题意: 每次可以选择。1. 休息 健康值+1。
2026-04-08 10:48:38
36
原创 2025 ICPC武汉邀请赛 G [根号分治 容斥原理+DP]
观察题目,我们可以用贡献法, 计算每个格子的贡献,然后累加起来,对于重复的部分我们要减去首先,计算两个位置间有多少种路径互通,我们可以利用组合数进行计算:当两点之间的横坐标距离差的绝对值为x,纵坐标的距离差值为y,那么有方案数ans=c(x+y,x)或c(x+y,y) 二者本身等价。
2026-04-06 20:06:10
451
原创 Problem - 2174B - Codeforces[DP优化]
我们观察可以发现 如果后面某次进行的操作比前缀最大值小或者相等 那么这次操作是无意义的 因此我们要保证每次给予卡片都要更新前缀最大值 所以我们要维护一个上限单调递增的序列 而中间递减的部分 我们给予0 卡片 这样一定不会更劣 所以我们只需要从前往后遍历 只筛选前缀最大值改变的点进行操作即可。所以我们重新设计dp的状态进行优化 令dp[k,j]表示前缀最大值为k的时候 剩余卡片为j的最大快乐 然后进行转移 用下标的差计算中间空缺的部分的快乐值。
2026-04-06 11:40:10
48
原创 Problem - 2180D - Codeforces
对于一段合法的圆 我们可以求一下第一个圆的半径的范围 然后就可以根据圆之间的距离求出下一个圆的半径的范围 如果最大半径大于最小半径 就是合法反之就是不合法 那么就直接分隔开 ans--题意很简单 要求圆的面积没有交点 然后求尽可能大的相切点的个数。首先每个点的半径的上界就是他到相邻两个节点的距离的最小值。
2026-04-05 22:47:00
46
原创 Problem - 2146D1 - Codeforces &&Problem - D2 - Codeforces
比如r=15 我们可以0于15 1与14 2与13 也就是(r-i)&i 一定为0 因为r全为1 r-i 就是去掉了i中为1 的部分 与i进行& 操作结果一定是 0 所以对于这种情况我们可以直接倒序输出。首先 a|b 操作 我们可以看作a+b-a&b 那么我们只需要让所有的a&b 的和最小即可 观察样例发现 所有的答案都是(n+1)*n 所以我们猜测 存在一种重新排列的方式 使得所有的a&b =0。
2026-04-04 12:23:29
43
原创 Problem - 2148F - Codeforces[字符串后缀排序]
首先 最朴素的思想 我们会找出当前最小长度的字符串 长度k 然后截取所有字符串的前k个前缀元素 然后排序 找到最小的一个 将整个字符串填进去 然后从k到下一个长度如此反复 但是排序和遍历过多 时间复杂度过大 这是从从左到右遍历比较后缀数字的大小。往前遍历的时候 我们可以维护一个vector<arrey<int,3>> 分别存储 {当前位置的字符 当前位置的后缀 在上一次遍历的排名 以及数组索引 }然后进行排序 这样可以复用后缀大小的关系 直接解决包含当前位的后缀的大小的问题。
2026-04-03 21:06:05
53
原创 Problem - 803F - Codeforces [数论 容斥原理 + gcd]
我们用cnti 表示数组中i出现的次数 用sumi 表示数组中包含因子i的数字的个数 那么显然sumi 等于所有i的倍数的cnt的和 那么包含 因子i的子序列的个数就是2^(sumi)-1。当数组大小是若干个不同的素数的时候 莫比乌斯函数为(-1)^cnt 如果有一个素数出现多次 就是0 排除多余情况。显然 所有的子序列一共有2^n -1 个 我们可以考虑用全集减去所有的gcd>1 的子序列。题意很简单 求一共多少个子序列的gcd=1。容斥原理的系数我们可以用莫比乌斯函数。
2026-04-02 19:58:51
38
原创 GYM106247B[数论 构造一个数字和因子 使得等于n个因子之和=数字]
1=1/2 +1/4 +1/8.. 最后会有两个相同的数字 1/2^(n-3) 我们可以把他拆成三个数字 1/2^(n-3)*(1/2+1/3+1/6) 最后构造出来的数字就是3*2^(n-2);当n>=3 如果存在这样的数字 那么等式就可以写成 x=x/a1 +x/a2 +x/a3 +……当n=2 肯定不能选择1 和他本身 那么最小的因数就是2 不可能存在两个不同的因数使得因数之和等于 n。也就是1 = 1/ai +2/ai +3/ai.......当n=1 显然选择一个数字和他本身即可。
2026-04-01 21:48:44
57
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅