- 博客(72)
- 收藏
- 关注
原创 莫比乌斯函数μ
莫比乌斯函数μn\mu(n)μn情况函数值n1n=1n1111np1×p2×p3×pmnp1×p2×p3……×pm−1r(-1)^r−1r其他0其中p1p_1p1p2p_2p2p3p_3p3pm……p_m……pm指的是nnn的mmm个质因数。注意:这里的p1p_1p1p2p_2p2p3p_3p3pm……p_m……
2025-04-12 10:54:26
496
原创 欧拉函数φ
那么我们可以换一个思路,就是用所有数的数量减去。知道了函数性质,就可以考虑用更优的筛法。的时间复杂度算出一个数的欧拉函数值。欧拉函数求的是有多少个数与代入值。的所有数之和减去它就行了。欧拉函数是积性函数,所以。的欧拉函数,询问时就是求。的欧拉函数值之和,也就是。这道题可以先前置求好。的函数值之和就行了。
2025-04-12 10:09:30
719
原创 康拓展开算法讲解及例题
开头的序列字典序都比这个序列小,后面的四个元素都可以任意组合,如:以。注意要用树状数组优化时间复杂度,在树状数组里面记得取模。所以,最后这个序列的排名就是康拓展开后。作第二位才会更小,所以这种情况就有。因为这是一个单调上升的序列,所以。的排序序列,康拓展开可以计算出。,后面没有比他小的,所以贡献为。比如我们有一个序列12345。的,数字互不重复的,且长度为。排列,给定排列是第多少个。指的是当前给定的排列序列,但是,这样做的时间复杂度是。可以在其之后任意排列,这。个值中,比排列序列中第。个值小的元素的数量。
2025-04-04 10:25:12
959
原创 双向BFS算法讲解及例题
我们可以暴力对每个字符串的变换的每种可能进行查询,用map标记一下是不是在题目要求里面,然后从终点也进行BFS遍历两次相汇的地方就是答案,答案就是把两端遍历的长度加起来,注意要减一,因为相遇的那个点两端都遍历到了,产生了重复。上面这张图中,黄色的部分表示普通的单向BFS查询到的范围,而紫色的范围表示的是双向BFS查询的范围。当然了,双向BFS也是有限制条件的,首先必须得先知道终点,不然根本没法双向BFS。我们从问题的起点与终点同时BFS,起点遍历一层,终点也遍历一层,最终相遇时停止。
2025-03-29 10:02:36
288
原创 权值线段树算法讲解及例题
普通的线段树一般是求区间之和或区间最值,所以这些线段树的每个节点的下标是原数组中的区间范围,每个节点存的是区间和或最值,而权值线段树的每个节点的下标是数组中元素的值,而权值线段树每个节点存的是当前元素出现的次数。在开始建树之前对原数组的值进行离散化,在线段树中操作时,因为经过了离散化,所以最大的值最多也只有元素个个数那么大,所以就可以写不同线段树就行了。这道题我用的是动态开点完成,在原数组输入的时候在update函数对现在贡献的逆序对进行记录,并同时将当前的元素加入线段树中,在查询并累加贡献和。
2025-03-28 21:18:09
639
原创 P2617 Dynamic Rankings
的基础上又增加了一个单点的修改,实际上很简单,既然是单点修改那么就在查的时候改就行了。比如维护数量的树状数组里。的一切值就废了,所以就将树状数组中。,但是我们有一个修改操作要将。,然后就可以把他的值消掉嘞。被改动了,所以原来关于。
2025-03-22 16:22:17
747
原创 整体二分算法讲解及例题
个查询时,我们就先把查询存起来,然后就可以将查询分为两类,就是上面的两类,左区间和右区间分别用一个数组存起来,然后分类讨论就行了,至于二分,就可以用归并排序的版子。我们二分的对象是这道题目给定的值域,及最小值与最大值之间的区间,在题目给定的数组中,对整体的值域进行二分,我们将。大范围内,所以还需继续查,那么就得往大的查,就将区间左侧放到当前的。,那就说明当前的二分值小了,因为我们需要的是第。大的数,所以当前区间可用,将区间右侧放到现在的。的值的数量大于等于当前的查询。的值的数量小于当前的查询。
2025-03-18 22:07:03
625
原创 树状数组算法讲解及例题
的值,使其一直维护区间和。一直往上找,直到找到了一个点包含整个数组的区间和(根节点)为止。,那么和线段树的思想差不多,当子节点被改动时,上层节点的值也会变动,怎么找到上层节点呢?所覆盖的区间,查找下一个区间,所以就在统计完之后用。但是这道题是点查询,所以我们不用写真正的区间修改。的和,先看一下核心思想部分,那个部分讲过点。包含的,所以这个区间的元素和就存在点。每个位置的覆盖范围由二进制最低位的。树状数组的区间查询类似前缀和,是。的范围内,这个区间的点之和是被点。一次排在次低位的数。的值之后,就应该改动点。
2025-03-08 15:41:05
599
原创 分块(莫队补充)
这时候两个端点不在同一个区块里面,所以得提前计算一下每一个块内的元素和。现在因为区间内包含了完整区块,所以说区块的和可以直接拿出来用。是在同一个块里面的,所以说可以直接暴力算,因为一个块的大小只有。十分简单的一道题,可以用前缀和解,但是也可以用分块。的大小,所以就算所有询问都在相同区块也只有。直接说不太好讲,用一道题来帮助理解。时时间复杂度最优,所以这道题也按照。的时间复杂度而已,不会超时。的和(已经前置计算过)再加上。这样,区间查找就可以解决了。的区间和,时间复杂度依旧是。接着上面,再来看比如询问。
2025-03-07 21:17:47
752
原创 归并排序求逆序对
那么就出现了一对逆序对,然而,因为这是归并排序,所以这两端区间都是有序的,所以当。上面是归并排序的代码。在排序的函数中,变量。遍历的是靠左的那半个区间,而变量。的时候用一个变量统计数量就行了。总是成立,当这个时候,如果。遍历的是靠右的区间,所以。对整个答案做出的贡献就是。上图是归并排序的过程。
2025-03-01 23:06:26
977
原创 P4145 上帝造题的七分钟 2 / 花神游历各国
然就就TLE了,应为如果每一遍都从叶子结点重新找要更改的点太多了,而且许多点改了都用不上,那该怎么办?,而最后的查询是求和,所以找不到什么式子可以直接求出结果。这里的区间查询就是普通的一个求和,所以就不用做什么改动。普通的区查就是加法减法乘法除法,整体的和是有规律可循的。那不妨就暴力一点,每一遍查询就从叶子节点重新找上来。是,我们就再也不用去管他了。已经讲过了,这里就不多说,直接进入正题。有区间的修改,有区间的查询,数据范围。时),再开下去就没有任何意义了。时,这个区间也不用去管他了。可以从数据范围入手。
2025-03-01 22:13:28
540
原创 莫队算法讲解及例题
对于区间查询数字出现次数的问题,我们可以使用莫队。比如,当询问区间是1n时,可以通过ON的复杂度解决。那接下来再询问2n或者1n−1时,就可以通过O1的复杂度解决这个询问。所以,当有m个询问的时候,我们就可以根据第i个询问的结果推出第i1个询问的结果。这样就不用每一次询问都用ON去跑了。于是就产生了优化版:对左端点进行排序。所以我们就可以对左端点进行分块(后面发文章讲)经过,可以得出每个块大小设为n时,可以使时间复杂度最优。
2025-02-22 16:59:44
913
原创 P4588 [TJOI2018] 数学计算
小豆现在有一个数x,初始值为1。小豆有Q1 m:将x变为x×m,并输出xmodM2 pos:将x变为x除以第pos次操作所乘的数(保证第pos次操作一定为类型 1,对于每一个类型 1 的操作至多会被除一次),并输出xmodM。
2024-08-29 20:44:29
1022
1
原创 我的创作纪念日
但是有一次在查东西的时候,看到个话题,然后就发了一篇。于是我就从动态规划开始写,然后图论,搜索,三分,线段树。发博客我觉得还真的挺有意思,平常是不是就想来一篇,但是时间问题,发的不是很勤。我写文章不是为了别人写,我写是我自己乐意,写写东西正好就放松一下,顺便还能把自己知道的讲给别人,两全其美。在写题目解法,算法思路的时候,就好像把题目自己重新做一遍,思路也重新捋了一遍,之后遇到这种类似的题目,基本上不会有想半天一行代码打不出来的情况。越写越多,虽然我不知道别人的看法如何,但是我觉得自己挺满意的。
2024-08-24 14:48:22
223
原创 P3373 【模板】线段树 2
根据乘法分配律,把一个区间的每个数乘x,对于区间和的改变也是乘x,所以我们找到被包含的区间之后,就将区间和乘x,但是别忘了,乘法同时也会影响上下层的线段树,所以说我们要加上一个乘法的懒标记,并且在这个时候,因为我们乘上了x,本来区间叫法的懒标记也会被卷进去,所以我们还要把加法的懒标记乘x,别忘了随时取膜然后我们来看pushdown函数,它将区间状态依次传递到最底层。左右孩子的区间和我们用ans来表示
2024-08-22 11:02:12
964
原创 线段树-区修区查
想一想,一个区间,每个数加上x,那么区间之和就和增长区间长度*x,所以,我们只要找到一个被完全包含的区间,就可以将他的区间和修改,注意,这里我们要打一个懒标记,因为这里的区间和被修改了,那更上层和更下层的区间和也会有变动。如果这个点被打了懒标记,就说明他是被修改的,那他的左孩子右孩子就也会做变动,所以就把左右孩子进行区间修改,接着把懒标记传递下去,最后不要忘了清除当前点的懒标记。当op为1时,输入l,r,x,表示将了l到r的区间内每个数加上x。区间修改,在点修区查的时候讲过的区查函数,现在给他放在这儿。
2024-08-22 10:06:09
393
原创 线段树-点修区查
所以,我们可以得出结论,求区间和,只需要遍历线段树,只要遍历到的点代表的区间被完全包含,就直接加上这个区间的和,当然,这种方法是不会出现重复的啦。只要遍历到的当前点左边界是x,右边界也是x,就可以确定它是我们要修改的点,修改它之后,在按照建树的方法,中分,求区间和,进行向上修改就行了。这里说一下,就是中间两个if语句,是用来精确范围的,如果小了,就往大的找,如果大了,就往小的找,总会找到x的。我们要修改的点,肯定是原数组中的点,所以在这颗线段树里一定是叶子结点,因为不是叶子的点都存储的是区间和。
2024-08-21 22:44:33
490
原创 P2080 增进感情
对于这n种事情,每种事情可以选择做或者不做,这里的n最大是30,每个事情的两种选择,2的30次方大概1e9,会超时,所以我们在最优情况:总和大于等于v并且好感值之差的绝对值等于零时,就没有再进行优化的的可能了,就直接输出零了。现在,他们对对方的好感值都为 0,小明有 n 件事可以干,每件事可以增加他对小红的好感 ai 点,并且增加小红对他的好感 bi 点。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。
2024-08-16 21:26:56
261
原创 P8306 【模板】字典树
sn 和 q 次询问,每次询问给定一个文本串 ti,请回答 s1∼sn 中有多少个字符串 sj 满足 ti 是 sj 的。查询的时候,就一步一步在树中找,如果找到叶子结点了,但查询的单词没找完,就说明它不是已出现字符串的前缀,如果找完了字符串,就说明是。在输入模式串的时候,就根据上图的思路,按字符串每一位查找,并且存储。第一行是两个整数,分别表示模式串的个数 n 和询问的个数 q。接下来 n 行,每行一个字符串,表示一个模式串。接下来 q 行,每行一个字符串,表示一次询问。
2024-07-09 19:21:47
461
原创 P1656 炸铁路
如果y的追溯值大于了x的时间戳,也就是y的追溯值在x之后,并且,y追溯到的这个点与x一定不连通,因为如果连通,那么y就会顺着这个点追溯到时间戳更小的点x,到这里,我们不难推出:x与y之间直接连通的边,只有这一条,并且没有间接联通的边。炸毁一条路对于一张图来说,本质上就是去掉一条边,不能通过铁路到达就代表这张图不连通了,对于这种去掉之后就可以使整张图不再连通的边,我们称之为割边。第一行 n,m (1≤n≤150,1≤m≤5000),分别表示有 n 个城市,总共 m 条铁路。里面里面讲过,这里就不多说了。
2024-06-19 18:36:28
562
1
原创 P3388 【模板】割点(割顶)
1号点去掉,图依旧联通,3号去掉,4号去掉,5号去掉影响都不大,这张图的割点是2号点,这下应该对割点有了解了吧。这种情况下,我们遍历当前点能访问到的所有点 ,如果没找过,那么如果与当前点x相连的y点的追溯值大于等于了x点的时间戳,x就是割点。做这道题,我们先得直到什么是割点,割点是指去掉之后可以让图不再联通,这样说可能有点难懂,我们可以画个图。是根节点就很简单了,只要他直接连接的点大于等于两个点,这个点一没,整张图是不是就断开了。所以,我们记录一下根节点连接的边的数量,如果大于等于二,它就是割点。
2024-06-13 19:10:56
321
原创 P2341 受欢迎的牛
这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。此时,点4的出度也为零,但是,这张图没有最受欢迎的牛,因为条件是除自己以外,所有人都认为它受欢迎才行,所以,在。结论:有环时,先把每一个环合并成一个点,在按照没有环的方案去找,最后最受欢迎的就是那个点合并前的所有点。输出被除自己之外的所有牛认为是受欢迎的牛的数量。
2024-05-29 21:58:15
1111
1
原创 P5931 灯泡
一个突然的想法出现在他的脑海里,他想知道在房间里他的影子的最大长度。对于每组测试数据仅有一行包含三个实数 H,h 和 D,H 表示灯泡的高度,h 表示 Mildleopard 的身高,D 表示灯泡和墙的水平距离。我们只需要用这种方法,算出墙上影子长度(刚好到墙角时,墙上影子长度为零),再加上地上影子长度(人与墙的距离),就能算出影子长度了。求最值的话,用分治最好,枚举人与墙之间的距离,算出最大值,这道题的话,讲一下三分做法。可以看出,这一刻,灯高度H比上D,等于人高度d比影子长(人距墙的距离)
2024-04-29 19:50:33
258
原创 曲线「三分」
明明做作业的时候遇到了 n 个二次函数Si(x)=ax^2+bx+c ,他突发奇想设计了一个新的函数F(x)=max{Si(x)},i=1,2……n。明明现在想求这个函数在 的最小值,要求精确到小数点后四位,四舍五入。
2024-04-26 20:19:49
374
原创 P3385 【模板】负环
使用spfa跑一遍最短路,然后用一个数组cnt记录每个点的入队次数,入队次数大于了n,就是有负环,跑了一遍没找到,就没有。输入的第一行是一个整数 T,表示测试数据的组数。第一行有两个整数,分别表示图的点数 n 和接下来给出边信息的条数 m。对于每组数据,输出一行一个字符串,若所求负环存在,则输出。给定一个 n 个点的有向图,请求出图中是否存在。接下来 m 行,每行三个整数 u, v, w。负环的定义是:一条边权之和为负数的回路。
2024-04-21 11:24:56
355
原创 新的开始
接下来为一个 n×n 的矩阵 p,其中 pi,j 表示在第 i 口矿井和第 j 口矿井之间建立电网的费用(数据保证有 pi,j=pj,i,且 pi,i=0。发展采矿业当然首先得有矿井,小 F 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井,但他似乎忘记考虑的矿井供电问题……第 2∼n+1 行,每行一个整数,第 i 个数 vi 表示在第 i 口矿井上建立发电站的费用。将这口矿井与另外的已经有电力供应的矿井之间建立电网,费用为 p。输出仅一个整数,表示让所有矿井获得充足电能的最小花费。
2024-04-20 21:33:02
585
原创 繁忙的都市
城市 C 是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的:城市中有 n 个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。接着就是最大边长度,我们要先在里面加一个特判就是如果选择的边数到了需要的n-1条边,就直接跳出循环,因为如果再找,可能会把后面更大的边(因为是排过序的)加进去,答案就不对了。两个整数 s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。
2024-04-20 12:28:50
357
原创 最短网络kruskal算法
然后我们按路径长度排个序,小的在前,大的在后,依次反填回图中,如果边x填进去时出现了环,就直接不要这条边了。然后,用剩下的边的边权相加,求出权值之和,删掉边之后形成树,权值之和最小的一棵,就是最小生成树。这里我们需要一个数组f,f[i]的值就代表i的"老祖",老祖的概念就是与它连接的最深的点,如果两个点的老祖相同,那这两个点肯定就有环了。kruskal算法的思路很简单,先建边,把边存进有3个值的结构体里面,三个元素u,v,w分别代表起点,终点,路径长度。这样可以保证所有的点联通,并且不会有多余的没用的边。
2024-04-15 21:22:02
295
原创 floyd最短路径解法
floyd的缺点是时间复杂度,跑一遍就是O(N^3),特别难受,在数据范围小的时候可以用,但稍微大一点,比如N=1e5,就直接爆掉了。,但是,它们都是用来求单源最短路径的,比如说有一道题,先建一个图,然后要进行k次询问,问两个点的最短距离,那怎么办?显然不合理,如果k是10000,就已经受不了了,所以,就得用一种新的算法来解决。所有的都弄完了,就是问什么答什么了,如果a[x][y]的值大于1e9,就走不过去,注意,不是等于0x3f3f3f3f,因为中间可能会在找的途中出现微小的差异,但不是很大。
2024-04-15 20:17:30
370
原创 P1106删数问题
键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。这时候就有人问了,比如说要删掉的数在最后一个,这里只遍历1到 len-1,怎么办,看for循环之后的代码:len--当1到 len-1都没有结果是直接执行len--,删掉最后一个,因为删前面的都不能得到最优解。删一个,如果是删最大值的话,得到的结果就是1436,但其实还有更优的,删4,得1386。要想数越小,那每一次删除的改变就要尽量大,要想更大,要怎么办呢。
2024-04-11 21:53:31
334
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人