- 博客(117)
- 收藏
- 关注
原创 P3582 [POI 2015 R1] 影迷 Movie-goer(扫描线+线段树)
通过模拟,我们发现每次减的区间是当前这个数前两次出现的位置[pre[pre[i]]+1,pre[i]],加的区间是[pre[i]+1,i]。用线段树进行区间加减操作即可。做法类似,都是记录每个数上一次出现的位置,进行加减操作,洛谷这道题相对而言更加简单,读完题就可以通过模拟想出来。
2026-01-11 14:41:04
326
原创 B4374 [GXPC-S 2025] 花 / flower(dfs序+线段树)
思路:涉及到单点修改,区间查询,显然是使用线段树。但在树中如何进行区间查询,单点修改呢,如果能将树转换为一个区间就好了,这里我们就要用到dfs序的方法将树转换为区间,在进行dfs时,记录每个节点的入栈和出栈时间,用两个数组in[x],out[x]表示,用val[tot]表示时间戳为tot的节点权值,仔细观察我们会发现。步骤:1.dfs序预处理 2.线段树进行单点修改,区间查询。
2026-01-01 19:46:32
180
原创 P1522 [USACO2.4] 牛的旅行 Cow Tours(连通块+Floyd)
思路:先用dfs标记一下每个点在哪个连通块,然后求出每个连通块内每个点的最大最短路,求任意两点之间的距离+数据范围,我们可以知道这道题要使用Floyd进行求解,求到了任意两点之间的距离后,我们就可以求出每个点到所在连通块其他点的最短路中的最大值,然后再从同一连通块的所有点的最大值中选出最大值,就是连通块的直径了。题目大意:给你n个坐标点(x,y),再给一个n*n的矩阵,代表两点之间的连边关系,连边之后会构成若干个连通块,定义连通块的直径为最远的两个点的距离(距离指的是两点间最短路径的长度)。
2025-11-22 20:21:35
139
原创 P1997 faebdc 的烦恼+P7764 [COCI 2016/2017 #5] Poklon(莫队)
思路:很板的莫队了。这里的add函数写得还是很妙的,cnt[x]表示x出现的次数,sum[cnt[x]]表示出现cnt[x]次数的数字个数。每次进行相应add和sub操作时更新这两个数组以及结果。题目大意:给你一个数组,然后进行q次询问,每次输出区间[l,r]中数字出现最多的次数。
2025-11-08 17:15:10
333
原创 CF Weakness and Poorness(三分查找+最大子段和)
思路:因为要求做差连续子段和绝对值的最大,所以x的范围一定在[a_min,a_max]之间才会使结果尽可能小,同时我们可以发现这是一个单峰函数,先递减再递增,所以我们可以用三分查找算法来找峰值,然后我们可以通过最大子段和算法O(n)得到所有子段和中的最大值,负数就取最小子段和然后加绝对值就行了。
2025-11-07 20:58:13
262
原创 2025 United Kingdom and Ireland Programming Contest (UKIEPC 2025)
题目大意:一个人以一米每秒的方式行走,方向任意,可以随时停下来花m秒时间在该位置做标记,现在给你总共t秒的时间,问标记所围成的几何图形的最大面积(起点默认已经标记)。思路:假设做k个标记也就是几何图形由k条边围成的面积最大,标记花费的时间k*m,剩下行走的时间t-k*m,也就是几何图L=t-km。为:L/(4*k)*cot(PI/k)*L。通过打表我们发现这是一个先递增达到峰值后再递减的函数,我们可以使用三分查找来找到峰值。因此,问题转化为找到最优的k,使得在满足时间约束的前提下,正k边形的面积最大。
2025-11-05 11:55:07
199
原创 Make a Palindrome(双指针)
思路:因为每次只能删掉数组中第k小的数,所以最后数组中一定至少剩余k-1个数,比第k小的数小的那些数一定要是回文。那么排序后,对于原数组中大于第k小的数可以删除,对于剩余的数,用双指针遍历,相等就继续,不相等就看是否等于第k小的数,是的话就删除该数,如果都不等于第k小的数那么输出no,或者最后剩下的数不足k-1个也输出no.
2025-10-24 16:42:28
137
原创 CF Yamakasi (前缀和+双指针)
同时我们要对该区间x是否为最大值进行标记,只有当区间最大值为x时才能对答案进行加pre[r]-s个数的操作。如果单纯地要我们计算子段和为s的个数那怎么求呢,首先子段和快速求解得用到前缀和,所以我们可以得到式子pre[r]-pre[l]=s,即区间[l+1,r]满足和为s,我们可以通过计算l<r中满足pre[l]=pre[r]-s的左端点个数,从而得到以r为右端点的子段和为s的个数,这样我们只需要O(n)的时间就可以得到整个数组满足子段和为s的个数。
2025-09-28 20:11:21
191
原创 CF Median Splits (中位数映射+前缀和)
如果一个区间和满足大于等于0,那么其(小于等于k的个数)一定大于等于(大于k的个数),所以我们可以使用前缀和快速计算出子段和,这道题要我们划分三个区间,取每个区间的中位数,然后对这三个数取中位数要求结果<=k,所以至少要有两个区间的和是<=0的,三个区间的位置是左 中 右,我们可以先判断。,使“中”区间右端点i的前缀和-前缀和最小值 尽可能>=0,若此时中区间右端点对应i位置,那么右区间左端点对应i+1位置,其区间和为suf[i+1]对应的后缀和。两个区间是否满足,若不满足 接着判断。
2025-09-26 21:25:36
234
原创 Rada and the Chamomile Valley(Tarjan缩点+多源BFS)
接着还需要找到从1到n一定会经过的桥,这时只需要以1所在的连通分量为起点,对缩点后的树进行dfs,找到到达n所在连通分量的所有边(桥),将这些边构成的集合记为E,E中每条边的两个端点构成的集合记为V。对于每次询问的节点u,如果每次都跑一遍bfs显然超时,考虑到每个查询都关注节点到V中节点的最短距离,我们可以转换思路:以V中节点作为源点进行多源bfs,这样得到的结果等价于原图中任意节点到V中节点的最短距离。5.枚举所有被记录的边,将两端的端点压入到bfs队列中,为避免重复操作,要对已压入的点进行标记。
2025-09-22 22:57:31
339
原创 Arithmetics Competition(贪心+排序+前缀和)
思路:如果对两堆选出的个数不做限制,那么我们只需要选出这两堆数的最大Z个数求和就行了,其中这Z个数中包含Xz个第一堆的数,包含Yz个第二堆的数,题目要求我们第一堆选出的数不能超过X,第二堆不超过Y,Z<=X+Y,所以如果某一堆在Z中的个数超过限制,那么就要增加另一堆选出的数。用前缀和计算出前Z个数中有多少个第一堆的数,然后判断两堆分别取多少个数,输出结果就行了。题目大意:给你两堆数字,分别有n,m个,要求第一堆选出不超过X个数,第二堆选出不超过Y个数,总共选出的个数恰好为Z个,求这Z个数和的最大值。
2025-09-21 16:42:38
262
原创 D. From 1 to Infinity(数位dp)
思路:先求出第k位数字是几位数字的第几个数,我们会发现x位数字总共有9*pow(10,x-1)个,那么总共有x*9*pow(10,x-1)个数字,按照这个规律我们可以计算出k是几位数字,然后用(k-1)/x可以计算出是x位数字的第几个数,然后取这个数字的前k%x个数位就行了,其余的数字进行数位dp即可。
2025-09-21 15:23:57
157
原创 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
先用bfs算出任意两点之间的距离,再枚举三个点看是否满足距离相等,本质不同。PTA就是喜欢考这类很板的条件判断Dijkstra。数据量太小了,直接爆搜。
2025-08-09 23:13:26
404
原创 牛客周赛 Round 99 EF
思路:要使每个小朋友的按位与最大,我们可以从高位向低位贪心,如果(1<<i)*m<=n则说明第i个二进制位在m个小朋友上都为1,反之,第i个二进制位在m个小朋友上并不都为1,我们需要计算出最多有多少个1在第i位上,如果((1<<i)-1)*m<n,那么多出的糖果n-((1<<i)-1)*m(向上取整)就要位于第i位。
2025-07-07 22:27:48
262
原创 P1903 [国家集训队] 数颜色 / 维护队列(单点修改莫队)
与基础莫队的区别在于需要多维护一个变量---时间,用于标记修改操作的时间T,当每次询问区间[ L,R]时,我们就要把时间点调整到这个询问所处的时刻T。分块排序时,将T作为最不优先的判定。即在初级莫队算法的基础上,排序时多考虑一个时间T。每次区间查询时,将时间T调整到当前区间所处时间,再进行和初级莫队一样的查询操作。块,而不是基础莫队算法的 sqrt(n) 个块;利用分块算法将给定的 n 个数分成。
2025-05-27 19:34:15
312
原创 AtCoder Beginner Contest 407 ABCDEF
思路:单调栈+差分。我们可以先用单调栈求出Ai的贡献范围,即以Ai作为最大值的区间为[L,R],左端点pl在[L,i],右端点pr在[i,R],此时区间对应长度的范围为[i-pl+1,R-pl+1],ai可以对长度为[i-pl+1,R-pl+1]的区间造成贡献,我们可以使用差分来维护,如果每次都是枚举左端点或右端点,时间复杂度为O(n*n),优化方法就是,每次看L,R哪个离i更近,哪个更近就枚举哪个,这样时间复杂度为O(nlogn)。)个'(',整个序列中恰好有n个左括号,那么既然一个序列至少要保证有(
2025-05-26 09:53:46
759
原创 2025ICPC南昌邀请赛补题
字符串前缀哈希:我们用array<int,30> 记录前i个字符,每个字符出现的次数对k进行取模,对每个不同的array<int,30>进行哈希处理,用a[i]表示前i个字符的哈希值,如果[L,R]是一个合法区间,那么一定存在前缀(L-1)等于前缀R。题目大意: 给你一个带权有向图,有q次询问,每次给你起始点p,和一个值x,每走一步都要除以这条边权,结果向下取整,问你从p出发最少走多少步可以使x变为0。题目大意:给你一个01字符串,选择一个有k个1的区间,将其进行重排,问可以获得多少个不同的字符串。
2025-05-25 13:52:26
823
4
原创 D. Graph and Graph(两个图同时Dijkstra)
思路:最小代价只有当两个图有两个相同编号的点连接时才会产生,否则就会无穷大,所以我们要标记两个图所有由一条边相连相同的编号,然后这个问题就转换成求从两个起点出发,到达同一终点的最短路径,我们可以将图1在u 点,图2在v 点的这一状态 ( u , v ) 视为一个点,每一次操作视为边,边权即为 ∣ ut − vt ∣ ,然后跑一边Dijkstra,得到从源状态到每一个状态的最小代价,最终我们只需要在所有之前标记过的编号中找一个最小值就行了。
2025-05-16 14:59:49
301
原创 2022 Hubei Provincial Collegiate Programming Contest
事实证明不应该听队友的),要是速度最小,路程就要最小,我们直接算出非急救站的点到最近的急救站的距离,这样一来一回可以使路程最小,然后在所有非急救站中选一个最大值,然后急救站之间也要连通,所以用最小生成树,可以计算出最大边,然后就可以得到结果了。题目大意:给你n个点,m条边,其中k个点为急救站,你可以从任意一个急救站出发,一条路径可以重复走,但要在满足到达下一个急救站之前所走的路径S,除以速度V得到的时间小于等于t的情况下,走完每一个点,求出满足条件的最小的速度v。
2025-05-15 16:46:52
365
原创 TCPC Tunisian Collegiate Programming Contest 2022
【代码】TCPC Tunisian Collegiate Programming Contest 2022。
2025-05-14 14:18:58
286
原创 M. Moving Both Hands(反向图+Dijkstra)
原理:由于两点均可移动,所以一定存在点p,使得s->p,p<-t,此时在第二层中建反向图p<-t转换成p->t,相当于直接从起点s跑单源最短路,而两层间对应点间全值为0的边,表示当前点为相遇点。思路:反向建图,第一层建原图,第二层建反向图,两层中对应点之间连接一条权值为0的边,最终答案为第一层的1号点到第二层i号点的最短路。题目大意:给你一个有向图,起始点在1,问起始点分别与另外n-1个 点相遇的最短时间,无法相遇输出-1。
2025-05-11 23:38:56
297
2
原创 D. Explorer Space(dfs+剪枝)
思路:既然走k步后要回到起始点,则k一定要为偶数,若为奇数则每个点输出-1,否则我们只需要求从起始点走k/2步的最小路程,注意这里不能使用Dijkstra,因为可以重复走某些点,Dijkstra走过的点如果不进行标记容易超时,所以我们考虑使用dfs+记忆化,设置一个记忆化数组dp[i][j][c]表示(i,j)这个位置再走c步的最小路程。题目大意:给你一个n行m列的矩阵,以及每个点上下左右相邻点的边权,求出每个点任意走k步后再回到当前这个点的最小路程,如果不能回到起始点则输出-1。
2025-05-11 21:09:05
430
原创 饮水计划(ST表+二分+差分)
思路:看数据范围肯定是需要预处理出每个区间的k的个数。遍历每个区间[i,j],k=j,求出[i,j]的最大值mx,再二分求出[j+1,n]中满足[j+1,mid]的最小值>=mx,并且mid要尽可能大(区间最值可以用st表来求,时间复杂度O(1)),然后求得区间[i,j+1]~[i,mid]的k的个数要加1,可以用差分来算,然后求前缀和就行了。这道题会卡“endl”换成 '\n' 就行了。
2025-05-10 12:51:17
439
原创 D. Paint the Tree(思维+dfs)
思路:既然要将树全部染成蓝色,那么A一定比B染色更快,我们要尽可能快的让B到达已经被染红的节点,一旦到达某个红色节点,我们就可以将问题转换为从该节点出发,用最少步数走完所有节点,答案显然是边数*2-最长路径长度,所以我们要B到达染红节点的最短时间,我们可以存储A到B这条路径上的所有节点,以及A到B的距离,由于每次两个节点都要移动,所以B到达染红节点的最短时间就是这条路径长度的中点处(distAB+1)/2,然后根据这条路径存储的节点找到中点处的节点,再对该节点进行dfs找出最长路径,即可得到答案。
2025-05-10 10:19:27
215
原创 A. Row GCD(gcd的基本性质)
所以我们需要先处理出gcd(|a2-a1|,|a3-a1|,......|an-a1|),再每次与a1+bj进行gcd就可以得到答案了。结合题目所给的a1+bj,a2+bj...... an+bj。
2025-05-08 20:54:28
394
原创 B. Zero Array(思维)
思路:每次给任意两个不同下表的数减-1,相当于在这个数组总和S上减2,S为奇数则不可能变为0,S为偶数时,一定存在两个序列组成两个S/2,这样每次都是在两个S/2上各减1,减S/2次刚好所有数为0,如果存在一个数大于S/2那么最后一定不能减到0。
2025-05-08 19:02:09
243
原创 2024昆明邀请赛J. The Quest for El Dorado (ST表+Dijkstra)
最后输出所有能走到的位置。思路:思路很好想,用小顶堆存{第i张票序号、这张票已经走过的路程,顶点} ,每次遍历当前这个点的邻接点,如果与上一次的管理者相同则看这张票的剩余路程是否大于这条边的长度,否则就要查找[i+1,k]这个区间中第一个管理者为A,且长度大于等于B的票,可以通过对每个管理者的车票路程长度 B 建ST表,二分查找解决。
2025-05-06 11:22:54
693
原创 牛客周赛 Round 91 EF
思路:模拟,能够翻转成功就三种情况:(1)矩阵只有两行全是1 (2)矩阵只有两列全是1 (3)矩阵的1呈现”十“字状,且交点为0思路:根据唯一分解定理:可知一个数的为本题要我们求n!的因子个数,n!=(n-1)!*n,n!可以分解成形如:,括号内的代表(n-1)!的分解,外面的是n的因数分解,那么n!的因数分解就是将原来(n-1)!中已经出现过的底数进行指数相加,然后再增加新的底数,化简为:,n!
2025-05-02 14:29:01
698
原创 Train Wreck 入栈出栈 -> 建树
思路:将此题的入栈出栈看成一个建树的过程,假设有一个虚拟源点0为根节点,遇到‘(’时入栈,开辟新节点,遇到‘)’时出栈退回栈中一个位置,由此可以建出一棵树。为保证序列唯一,我们应当使每个节点的儿子节点的序号都不一样,这里我们可以使用贪心的思想,每次将出现次数最多的数字赋值给这个节点,每次赋值都要弹出出现次数最多的数,这里可以使用大顶堆,遍历完子节点后,更新大顶堆,然后再递归子节点,如果大顶堆为空不能进行赋值了,那么就输出“NO",否则可以输出合法序列。问是否可行,如果可行输出进栈颜色方案。
2025-05-02 13:50:06
296
原创 牛客周赛Round 88 补题G(树上前缀和,树形dp)
例如:当x=5,y=3时,x的叶子节点的数组下标为2~3,所以当我们求其他叶子节点的最大价值时,就是在求区间【1,Lx-1】的前缀和最大值,和区间【rx+1,idx】的后缀最大价值。2.当我们将x接到y处时,整棵树最大叶子节点的价值将是max(除x以外的叶子节点价值,x叶子节点更新后的价值,x的父亲节点是否为新的叶子节点的价值)更新后的x叶子节点价值为pre[y]+x的子树最大价值,所以我们还需要通过自底向上求出每个节点子树的最大价值。如何求除x以外的叶子节点价值呢?
2025-04-09 15:05:22
491
2
原创 钉耙编程(3)补题
主要还是运用哈希映射+并查集的思想,我们可以对部落设置两个数组,h[a]用来表示编号为a的部落在哪个位置上,tribe[h[a]]表示在h[a]位置上的部落编号为tribe[h[a]]。然后在查询a野蛮人所在部落编号时,我们先用find查找其所在部落位置即合并之后的位置,再输出tribe[],就是这个位置上的编号啦。思路:我们可以将可以面试的公司放入一个队列中,并且每次增加新的能力要求。我们可以用m维的优先队列,每次能力更新后,从最小值开始判断是否 有满足条件的公司。思路:一道类似的题目。
2025-03-27 20:41:24
513
2
原创 牛客周赛Round 84
思路:本题要我们求p/q mod M ,即p*(q的逆),q为排列数,我们可以很容易得到,即 n!种摆放方式,再将a[i-1]a[i]插入n-1个空中的任意一个,就可以得到a[i-1]a[i]在(n-2)!个排列中做出了贡献,而a[i]a[i-1]的贡献与a[i-1]a[i]一样,那么我们要计算出(a[i]-a[i-1])+(a[i]-a[i-2])+(a[i]-a[i-3])+...+(a[i]-a[1])的和,那么这个式子化简一下就是(i-1)*a[i]-pre[i-1],最终我们得到的结果p/q=
2025-03-10 12:31:37
459
原创 CF The Walkway
(为什么pre[i+1]-pre[i-1]-1需要减一,因为我们要计算第i个点对区间(v[i-1],v[i+1])的影响,不能包含第i+1个特殊点,所以减去的是第i+1个特殊点。思路:先预处理出每个区间(左开右闭)需要吃多少个饼干,用pre前缀和数组统计前i个特殊点区间吃多少个饼干,枚举第i个特殊点删掉后需要吃多少块饼干,例如我们要删掉第i个特殊点,现在可以删除一个特殊点,问这个人最少吃多少饼干以及有多少种删除方式。一条路上有几个特殊点,一个人会在以下这几种情况吃一块饼干。
2025-03-07 15:00:36
310
原创 2025“钉耙编程”中国大学生算法设计春季联赛 - 热身赛
思路:时间为8s,所以可以考虑暴力做法,我们会发现这三种操作不涉及进位也就是说我们可以先预处理出前面的n-1位在这三种操作下的所得结果,再加上这一位,例如yu[i][j]=yu[i/a][j/a]*a+min(i%a,j%a),表示i和j进行与运算所得结果,i,j的范围为0~1023,超过的部分用递归进行求解,然后我们定义bool dp[i][j]为第i次操作能得到j,所以我们只需用第i-1次操作得到的每个数与ai进行三次运算即可,最后遍历dp[n][i]求和,即得到最终结果。补题1006和1009。
2025-03-02 11:03:12
1171
原创 牛客练习赛B题(前后缀)
我们将这一步看作分界线,枚举每一条分界线计算出这条路径的元素和,然后我们考虑交换列的情况,(1)分界线左边的列与分界线右边的列交换 (2)分界线左边的列与分界线交换 (3)分界线右边的列与分界线交换,同时我们发现左边的列交换到右边只与下面的数字有关,右边同理,所以我们还需要维护一个前后最大差值的数组,pr[N],和sf[N]。由于数组空间大小为1e6且有多次询问,每次询问得重置数组,为了减小不必要的时间和空间浪费,我们选择每次开vector(n+5)的大小。
2025-02-22 10:48:51
228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅