- 博客(48)
- 收藏
- 关注
原创 a 的 b 次方模 p(1e18)_题解
直接采用快速幂算法,注意到算法中包含乘法,而直接乘会溢出,那么再用龟速乘(快速幂改)的乘法即可通过本题。
2024-02-17 20:42:37
449
原创 a 乘 b 模 p_题解
【快速幂】算法题。面对a×bmodp这个结构,直接求必然溢出 long long,任何基本结构都不好使。模仿快速幂算法是先将b二进制分解(假设b的二进制表示为b59b58b57...b2b1b0a×b∑i059bi×a×2ia×bmodp∑i059((bi×a×2imodp))modp通过上面的式子,我们将原本的a×b经由b。
2024-02-16 23:53:36
830
原创 a 的 b 次方模 p_题解
【快速幂】算法模板题。面对abmodp这个结构,并没有什么显而易见的切入点,直接求必然超时Ob。而快速幂算法是先将b二进制分解(假设b的二进制表示为b29b28b27...b2b1b0ab∏i029bi×a2iabmodp∏i029((bi×a2imodp))modp通过上面的式子,我们将原本的ab经由b的二进制拆分转化成了 30 个(因为2301。
2024-02-16 00:10:21
1115
原创 T^T_题解
当直接算没有太好的方式,那么可以尝试枚举不一样的东西。若枚举第一个 T 的位置(i∈1n),那么计算答案时还需要枚举中间 ^ 的位置(j∈i1n),然后再枚举最后一个 T 的位置(k∈j1n)这样直接枚举需要计算的次数可以达到On3级别,显然不够。一个容易想到的优化是最后一个 T 可以通过预处理,计算出区间j1n中有多少个 T,每个 T 对答案都可以造成 +1 的影响,这个预处理可以通过后缀和完成。那么原算法需要的计算次数可以优化成On2级别,仍然不够。
2024-02-15 01:05:33
867
原创 末两位数(1992)_题解
指数函数增长速率过快,直接计算中间过程任何一种基本类型都无法存储。通过乘法运算的规律,可以发现末两位数只和末两位数相关,故直接对中间结果保留末两位数(mod 100)即可避免乘法溢出。
2024-02-13 20:41:46
1013
原创 数的种类_题解
数据是分散的,如果可以用某种方式整理好,问题也许就迎刃而解了。比如说:排序。当数据已经排好序,再求解其中元素种类实际上就等价于求解数组的“段数”了。故排序后从前往后扫描累计答案即可。
2024-02-12 22:55:18
531
2
原创 n 个数的前缀最大值_题解
暴力遍历前i个数时间复杂度为On2会超时。记第i个答案为ansiansimaxa1a2...aimaxmaxa1a2...ai−1aimaxansi−1ai。故递推求解即可。
2024-02-11 19:19:29
1021
原创 最大优势(1e5)_题解
首先可以知道数组A和数组B的顺序均没有关系,所以我们首先将数组A和数组B进行排序,然后考虑两个数组的第一个元素。ABABA。
2024-02-09 23:20:17
925
原创 下一个排列_题解
此题属于找规律题,我们可以把一个序列的全排列写出来,然后对比找规律,比如序列 1 2 3 4 5,全排列如下:1 2 3 4 51 2 3 5 41 2 4 3 51 2 4 5 31 2 5 3 41 2 5 4 31 3 2 4 51 3 2 5 4。
2024-02-08 01:04:26
423
原创 扑克牌游戏_题解
本题其实是改版的【约瑟夫环】问题,本质上还是依次找到某个位置的人,然后将这个人踢出队伍。环状结构可以使用循环取模的方式来模拟(也就是代码中pos的运行逻辑)。踢出操作可以使用标记数组(也就是代码中的vis),false 代表没有被踢出,true 代表已经被踢出。
2024-02-06 23:25:31
474
原创 Xor 特殊情况_题解
注意到对于单次的查询区间lr0l−10r。对于任意区间0R可以找到最大的xx≤R且xmod40),0R的异或和等价于xR的异或和。(根据上一题题解中的【拓展】可以求证此结论)
2024-02-04 23:26:31
1046
原创 XOR Easy_题解
首先,暴力计算提交后会 TLE。其次,注意到x⊕y⊕yx(这里⊕代表异或操作)。最后,可以考虑使用前缀和算法,类比做出【异或前缀和】用于快速求解区间异或值。
2024-02-04 01:47:22
895
原创 子矩形_题解
首先需要枚举到并判断所有可能的矩形。注意到gij的取值范围非常的小,根据鸽笼原理,若矩形中元素数量超过 10,那么这样的矩形必然不合法(必然存在某种数出现的次数超过一次)。所以可以枚举矩形的某个角落(代码展示中枚举的是左上角坐标),然后再枚举其横纵延申的距离(不可能超过 10),通过上述推论可以发现可能合法的矩形其实非常少,且每个合法的矩形面积都不超过 10。故直接判断每个可能的矩形是否满足条件然后累加近答案中即可。
2024-01-29 23:28:37
446
原创 区间众数_题解
本题数据范围较小,时间限制较为宽松,可以考虑对每个区间扫描求众数,这样时间复杂度也可以接受。难点在于如何求给定数组的众数。可以通过计数数组,记录每种数出现的次数,然后通过扫描计数数组求解出现最多且最大的数。
2024-01-28 22:37:32
515
原创 两个数的乘积(unsigned int)_题解
在所有基础类型中能存下两个 unsigned int 乘积的也就 unsigned long long 了,故直接转换类型相乘即可。注意到可能乘积为负数,所以需要先判断符号再相乘输出即可。
2024-01-27 19:47:05
507
原创 鬼谷子的钱袋_题解
三个条件:1、钱袋数最小;2、能够构成 1~n 的所有数;3、不能有钱数相同的钱袋(1 除外)。现在只考虑前两个条件,构造的序列非常简单:1, 2, 4, 8, …,2kg(其中gn−∑i0k2i且有g2k1成立(否则应该继续拆分)。首先,第二点容易证明,这里不予证明。第一点可以这么看,根据二进制相关知识可以发现124...2k可以构成小于2k1−1的所有数,特别的,若需要构成的数超过g那么先把g加进去,剩下的由上述序列补齐即可。
2024-01-26 20:56:28
957
原创 循环数组_题解
圆形排列中存在n对大小关系,如果存在一种合法的获得序列的方式,只有当存在不超过一对相邻小朋友,满足顺时针方向的小朋友的数字小于前一个小朋友。否则应当是无解的。
2024-01-25 20:21:47
415
原创 整数拆分_题解
其中有gn−∑i1k成立。首先,基于【贪心】思想,假设当前没用过的最小的数为x,当前已用的数的和为sum,那么如果满足x1≤n−sum−x(用x这个数,且用完后剩余的数不小于后一个没用过的数),那么从字典序的定义出发,没有理由不使用x,也就是说拆分的数中必定包含x。利用上述推论,我们可以确定k的取值,且同时保证了拆分出序列满足“字典序”最小。
2024-01-24 18:47:49
973
原创 方格图剪纸游戏_题解
本题本质上是在问方格图四联通的状态下存在多少个极大矩形连通块。首先需要获得每个极大连通块的数据,这一点可以通过任意一种搜索完成。其次需要想办法判定当前连通块是否为矩形,可以用一种类似哈希的方式来完成,先求出整个连通块的外轮廓:最小和最大的横纵坐标。如此一来就获得了连通块的最小外接矩形,那么当且仅当连通块大小等于最小外接矩形大小时可以判定该连通块为矩形。forint;<=;++
2024-01-23 22:17:30
504
原创 求解区间段数(区间查询)_题解
若从前往后给每一段的元素赋值,第i段元素都赋值为i那么单次查询的答案就是两个端点处元素值的差值加 1(等价于中间存在多少个不同的元素)。例如数组 {2, 2, 3, 1, 3, 3} 就会被赋值为 {1, 1, 2, 3, 4, 4},当完成这个转化之后答案即可O1查询。
2024-01-22 21:42:30
499
原创 关于 迪杰斯特拉 算法的 vis 标记数组与 spfa 算法的关系
对于最短路的两种算法的分析对比报告首先我们看两份代码: 这是 dij 的一份代码,其中删去了通常 dij 算法使用的 vis 标记数组。 题目链接#include <bits/stdc++.h>using namespace std;#define _for(i, a, b) for(int i = (a); i <= (b); i ++)inline void read(int &x, int &y, int &z) { scanf("%d%d
2021-10-13 17:09:08
354
原创 AtCoder_221_f Diameter set 题解
思维模拟加数学因为是最远点,故必定为直径。 我们知道树的直径并不为一。但是考虑一下,如果一棵树的直径中有奇数个结点,其实对于它来说其“中心结点”是每一条直径都必须通过的。(证明靠脑子)由上面那个想法我们可以类比出偶数结点的情况,那么其“中心”将会变成一条边,也就是说这条边两边的点是必被直径通过的存在。所以,当结点为偶数时,只需要分别计算两侧结点所领导的子树中有多少个结点的深度是直径的一半即可。但是在结点数为奇数个时问题就会有转变,因为类似于“菊花图”这种的,其实它隐含了一个组合问题,是
2021-10-09 11:59:00
207
原创 牛客/20328/J Sudoku Subrectangles 题解
优雅的暴力枚举首先,根据容斥原理,行不过 52 个元素必有重复(列同理)我们考虑枚举矩形的上下边界,由于上下边界间距离不会超过 52 所以共有 52*n 种上下边界。在上下边界之间查找可能的左右边界,假设矩形只有一行那么左右边界显然可以通过尺取判重的方式获得,又注意到本题中行列判重是分开的,所以我们可以把行列分开判断用一个数组(代码中是 ts 数组)记录当前列的向前最远可匹配位置。由于行列分开所以我们发现列中具有重复单词时,直接把当前位置 ts 值置为当前位置下标即可,否则用尺取法判断通过行
2021-10-08 17:55:21
130
原创 牛客/20328/A Minimum Cost Perfect Matching 题解
思维(构造)首先考虑什么时候 i & pi == 0 很显然的一点是当 pi == i ^ t (这里 t 代指一个二进制全为 1 的数)时成立 那么由此得知当 n 为 2 的幂的时候只需要不断地首尾交换数值就够了,而我们进一步的分析上面的条件可以发现如果将对应 i 的 0 位的数值换为 1 也是可以的,所以可以将后面的大数(高位有 1 的数)向前调整,就可以把高位的影响给消除。 综上所述,我们可以进行最高位的二进制进行划分,把所有的最高位的二进制以上的值向下调整,然后将二进制内的数
2021-10-08 11:55:34
104
原创 牛客/20328/C Bit Compression 题解
半记忆化搜索(空间与时间平衡的艺术)单论空间,用 a 数组直接记录;计算实践得出总时间复杂度一亿多一点。具体思路:前面 14 次幂采用暴力枚举: 3^14 ,后面 4 次幂采用记忆化搜索:2^(2^4) #include <bits/stdc++.h>using namespace std;#define ll long long #define _for(i, a, b) for(int i = (a); i <= (b); i ++)int n, m;bool
2021-10-08 11:28:25
88
原创 AtCoder_abc221_e LEQ 题解
1、任意两个节点 i,j (i < j)2、有 Ai <= Aj 3、那么:点对(i, j)对答案的贡献为( 2^(j - i - 1) ) 综上所述:每个点的贡献与前面所有小于等于其节点到这个点距离和有关系(非线性)观察 3 的式子之后发现若以 2^(i+1) 表示第 i 个点的价值,那么答案就是当前点用 2^j 表示后分别除上前方所有的符合条件节点的价值之后的和。关于除法,我们可以通过转化逆元处理出来由通过提取公因子 2^j 而将原式转化为加法,故本题可以用树状数组
2021-10-07 17:55:40
258
原创 湖南文理学院第十六届程序设计竞赛_题解
我是比赛链接A(AtCoder):平方不等式思路(huas_wlq):直接判断输出#include <bits/stdc++.h> /// 万能头文件(囊括了绝大多数的头文件,无需再定义每一个头文件) using namespace std;int main(){ int a, b, c; cin >> a >> b >> c; if(a * a + b * b < c * c) cout <&
2021-05-15 12:47:14
1022
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人