- 博客(62)
- 收藏
- 关注
原创 二进制专项
n & 0n & 1n & n = nn | 1n | n = na ^ a = 0a ^ 0 = an ^ 1~0<<n << kn * 2^k>>n >> kn / 2^kn & maskn | mask位运算符的优先级低于算术运算符(如),但高于逻辑运算符(如&&||&&&&int。
2025-07-18 17:00:55
678
原创 #贪心#最小双端
计算每个阶段从初始亮度到目标亮度需要的顺时针旋转次数,并过滤掉不需要调整的阶段。:尝试所有可能的分割点,计算每种分割方式下两组的最大操作次数之和,并找出最小值。每个点位都需要xy两端二选一,找到最终两端加起来最小的情况。:对需要调整的差异值进行排序。
2025-07-18 14:18:30
245
原创 Dijkstra 算法求解多种操作
我们发现,路径的选择是非常多种多样的,无法靠人力去完整的思考有哪些可能。(先减 2 次到 5,乘 2 到 10,再减 1 到 9),总花费。需要限制节点范围,否则节点可能无限大(如多次乘 2)。的最优操作序列,使得总花费最小。问题转化为:在该图中寻找从节点。的最短路径,可直接退出循环。(边权为操作花费)。Dijkstra 算法求解。时,加 1 或乘 2 会使。,比直接加 2 次((当前花费, 节点)当队列中取出的节点为。,符合最优路径花费。
2025-07-17 20:25:44
684
原创 竞赛常用加速技巧#模板
逐个读取字符,避免了标准输入函数的类型解析和缓冲区开销。对于大规模数据(如百万级整数),这种方式的效率远高于。函数将连续的数字字符手动转换为整数,跳过非数字字符(如空格、换行符),并处理符号位(一般情况,程序会自动内联,可以不用。
2025-07-15 16:59:04
162
原创 树上组合数(树上染色)
树的染色计数问题是组合数学与图论结合的经典问题,其核心思想是利用树的递归结构和乘法原理计算合法的染色方案数目。:如果一个过程可以分解为多个独立步骤,每个步骤有若干种选择,则总方案数为各步骤选择数的乘积。种颜色,要求给每个节点染色,使得相邻节点颜色不同。求满足条件的染色方案总数。:树中任意一条边的两个端点颜色不同。
2025-07-14 13:12:17
332
原创 贪心#贪心的世界
贪心算法是一种在每一步选择中都采取,从而希望导致结果是全局最优的解题策略。它不追求整体最优,而是通过局部最优的累积来试图达到全局最优,适用于具有和的问题。
2025-07-08 21:43:42
752
原创 数位dp()
从高位到低位逐位枚举数字,根据前一位的数字决定当前位可以选的数字(与前一位差的绝对值为 1),同时用记忆化缓存中间结果,避免重复计算。对于本题,我们需要统计所有满足「相邻数字的绝对值差为 1」的数的个数。数位 DP 通常用于统计满足某些条件的数的个数,核心是。内满足条件的数的个数,减去。内满足条件的数的个数,得到。
2025-07-08 15:18:22
183
原创 动态规划-逆向
本题主要考虑倒过来的dp;分散的dp,不维护每一个值,维护每一个初始快乐值。如果前面出现7,那么dp7看dp里是否已经有8,有,则等于dp8+1;如果前面不是7,是5,此时后面没有6,所以5只能自娱自乐,=1。假设后面有89,dp9=1;
2025-07-07 21:47:53
832
原创 博弈论基础-笔记
1-3区间,先手比较了一下,如果取10,那么就是把1-2区间给对方差0,最后差10,取1把2-3区间给对方,显然2-3区间差-9,最后-8,取前者。首先,我们发现手里就1个,输,2个,分成11,必赢,3个,只能分成12,对方会选2,4显然分13,5显然必输。这时候,你发现,5-3,不论怎么取,你都会把刚才那些比5-3小的给对方,然后对方反手给你2-1。不确定,但是确实卡住了。-4呢,5-4,你发现可以变成2-1,6-4,你发现可以变成5-3。然后1-4区间,如果取1,把24给对方,差-(-8),最后差9。
2025-07-05 17:13:46
645
原创 LCA(最小祖先)+ST
/ 递推公式//意为,2的k-1次的祖父节点的2的k-1次祖先是该节点2的k祖先。// f[u][k]:节点u的第2^k个祖先。if(dep[f[u][k]]>=dep[v]) // 如果跳跃后仍不低于v。if(f[u][k]^f[v][k]){ // 如果跳跃后不相遇。f[u][0]=fa;// u的第2^0=1个祖先是父节点。u=f[u][k];
2025-07-04 16:23:29
902
原创 分层图最短路(模板)
这一题看似就是一个有权值的最短路问题,但是中间有K次免费,这几次免费会造成非常大的影响,所以我们把原图,复制多份,然后每上下两个图之间,每个点的和另一个图所有与自己本图连通点的对应点有一个权值为0 的路径,比如,12,13连通,就在1与2.2,1与2.3建立两条0权值。跑到2层,就开始在2层与3层跑,一直跑到k+1层,最终终点变成t+n*k。之后就是用dijkstra跑s到t+n*k的最短路了!不会dijkstra或者建图,建议看这里。
2025-07-03 21:42:10
188
原创 数论基础知识和模板
单位元:在一个集合中,对于某种运算∗,如果对于任何的集合元素 a,和元素 e 运算,得到还是集合元素 a 本身,则称 e 为这个运算下的单位元。实现就是,对于每个数,我们都将他对整个现在已有的质数表筛一遍,比如3是质数,那么把已有的2相乘,筛掉6,但是并不往下进行,因为比如12,最小质数因数是3,在遍历到4时自然而然就筛掉了,这样每个数就只会被他最小质因数筛掉一次,达到了线性。为了保证逆元是正数,我们把公式调整为 i−1≡(p−k)×r−1(modp),这里的 r 其实就是 p%i。vis[j] = 1;
2025-07-02 20:04:53
829
原创 凸包进阶旋转卡壳(模板题目集)
很明显从一开始,b+1的点一定是要大于b点(0),所以从一开始,b就被推到了i-j的上面,也就是左侧,,,很明显成为了正数;// 找到边 st[i]-st[i+1] 对应的最远点 st[j]//众所周知,叉乘是两向量的对应平行四边形的面积。
2025-07-01 21:13:28
694
原创 凸包提升(还是Andrew)
本题仅需要把每张卡生成4个点即可,最后发现,由于卡圆角圆半径与圆一定相切,那么平移我们围出来的凸包,最后剩下若干个弧;由于2个垂直,减去180度;所以每个点余下两个角是180度,由于多边形的角和等于180*(点数-2);所以余下的圆弧一定是360度,也就是一个圆。}//引入旋转函数,求出根据degree旋转后的x,y值。并且由此处代码进行改写。
2025-07-01 16:03:54
482
原创 离散化(合集-如何使用离散化)
cin>>n;i<n;i++){i<n;return 0;约束:最多1e6x大小:<1e9这里看到x大小1e9,不能直接开fa[],所以要离散化映射到一个小的数组。
2025-06-30 12:08:03
742
原创 最长翻转子串(主要讲manachar)
int T;int mx, po;while (T--){//多次输入要求input ();i <= cnt;++i){i >= 1;--i)i <= cnt;return 0;
2025-06-28 16:06:49
860
原创 KMP(最长公共前后缀优化匹配查找)
KMP 算法的 数组是用来快速匹配字符串的,但我们这里只需要它的一个特性: 表示字符串前 个字符中,最长的公共前后缀长度。例子:对于字符串 ,计算 数组:第一步// 构建next数组:计算每个位置的最长公共前后缀长度vector<int> buildNext(const string& s) { int n = s.size(); vector<int> next(n, 0); // 初始化数组,默认值都是0 for (int i = 1; i < n; i++) {
2025-06-28 11:48:06
664
原创 树的重心(双dfs,换根)
/deep数组存储以每个节点为根时的总深度和,point数组存储子树大小。// 每个子节点i的子树中的所有节点到当前节点的距离都要+1,因此增加p[i]// 当根从x变为i时,i的子树中所有节点的深度减少1(距离根更近了)// d[i]是子节点i的子树总深度,p[i]是子节点i的子树大小。// 更新当前节点的子树大小:加上子节点i的子树大小。// 第一次DFS:计算以节点1为根时,每个节点的子树大小和子树总深度。// n-p[i]是除了i的子树外的节点数。// d[x]是以x为根的总深度和。
2025-06-27 21:37:24
683
原创 dp进阶,树形背包(dfs+01)
顾名思义,就是在对树进行搜索的时候,由于限制了子节点选根节点必选和节点数限制,所以需要额外利用背包来维护最大值假设根节点就是0,我们很容易 发现,这就是一个正常的树求和,但是限制了节点数量,所以需要用背包去规划这个限制(容量)局部分析:取一个倒数2小的子节点,可以求出该节点下面选择0-n个子节点的最大值dp[x][i]:x代表该节点的序号,i代表这个节点占多大容量,dp[x][i]自然就是维护的最大值;将其上传,一直到【0】【m】的最大值int n,m;struct ed{
2025-06-27 17:00:33
804
原创 记忆化搜索(dfs+memo)无环有向图
记录从节点 x 出发的所有边的权重之和。根据数学原理,我们很容易发现,一个根(起点)的期望,等于他所有子的期望加上边权和,除边。这样写出来,思路是对的,但是在多条路径下,我们明显可以发现,每个子节点都会计算很多次,所以我们使用记忆化来优化;//如果计算了,直接返回结果。//到达终点,期望为0。//记录从节点 x 出发的所有边的权重之和。for (auto i : a[x]) {//所有子的期望和。//返回时给memo记录。//判断是否被计算过。
2025-06-27 15:52:26
462
原创 树状dp(dfs)(一道挺基础的)
每个点都有两个状态(1/0),即选或者不选,如果选了,因此我们可以设置 dp[0][i]为点没选之后的最大值。dp[i][1]设置为点选之后的最大值。//先给每个人来的状态设自己为基础开心dp[i][1]+=(dp[0][son])i++)//没有上司就是顶头上司,根。//用来储存树的,一个上司不止1下属,//看看有没有上司的,用来寻找最根的节点,方便遍历。//因为后面遍历加直系下属,所以先把这个加一次的提前加好;son[x] = 1;
2025-06-27 10:36:35
265
原创 *背包问题变种加动态存储路径(就是背包里是哪几个东西)
在遥远的国家弗罗尼亚,法庭审判的裁决由一个由普通民众组成的陪审团决定。每次审判即将开始时,都需要挑选一个陪审团,挑选方式如下。首先,从民众中随机抽取几个人。对于这个候选池中的每个人,辩护方和起诉方会给出一个 0 到 20 的分数,表示他们对该人的偏好。0 表示完全不喜欢,20 则表示认为此人非常适合担任陪审团成员。法官会根据双方给出的分数来挑选陪审团。为了确保审判公平,陪审团倾向于偏袒辩护方或起诉方的程度应尽可能平衡。因此,必须以一种让双方都满意的方式挑选陪审团。
2025-06-26 22:02:13
677
原创 记忆化搜索(dfs+memo)胖老鼠的奶酪
胖老鼠(FatMouse)在一个城市里存放了一些奶酪。这个城市可以看作是一个维度为 n 的方形网格:每个网格位置标记为 (p, q),其中 0 <= p < n 且 0 <= q < n。在每个网格位置,胖老鼠在一个洞里藏了 0 到 100 块奶酪。现在他要享用他最喜欢的食物了。胖老鼠从位置 (0,0) 开始。他吃掉所在位置的奶酪,然后水平或垂直跑到另一个位置//意思就是只能跑出十字型的选择//。
2025-06-26 21:07:25
891
原创 dp(非常简单的思路的两道动态规划题
就是用一个数组维护一段设备,每个数与最小的设备替换,没有比他大的就新开一个。最后开几个就是几个。这三个状态转移而来(需考虑位置是否在 0 - 10 范围内)时能接到的最大馅饼数。由于每秒移动不超过 1 米,那么。,常用于优化搜索和维护动态数据结构(如最长上升子序列)。内查找满足特定条件的元素位置。提供的一个函数模板,用于在。
2025-06-26 14:32:48
298
原创 线段树。。。。。(加法和进阶加乘法混合)
在询问时,判断范围,如果在范围内,直接就是最大范围的值,如果不在,就取1节点的两个二分区间,比较一下大小,如果两边都有就是都有,往下去一直找。比如1-16的大区间。往下走,发现5-8这个直接就是一个,9,10是一个,11是一个。因为1-2-4-8-。2个,然后下面节点就是4567,4个正好首节点大小个。基础的线段树就是去构建一个树,这个树符合二分,每个节点p的子节点是2*p,2*p+1。当然可以实时更新整个树,但是时间复杂度大,所以我们使用懒标记。有非常多的细节,调试好久。,并在用到时把堆积的懒标记下传。
2025-06-25 20:36:39
204
原创 使用倍增法优化二分查找(树状数组)
/传统二分查找每次需要 O (log n) 次查询。倍增法通过二进制跳跃,将查询次数优化到 O (log n) 次,但每次跳跃的步长更大。对于大规模数据,常数因子更小,实际运行速度更快。通过离散化,统计每个数出现的次数,把树状数组的每个a[]变成每个数的个数,把树的c[]变成该数前面有几个小于自己的。之后查找优化为倍增即可。
2025-06-25 16:07:38
419
原创 树状数组(模板)
在储存c数组(和),我们只需要把处于2^n位置的进行求和储存进c,不难看出来,我们之后求1到n的和,比如7,就是c4+c6+c7。467位置完全满足2进制的关键点,可以用lowbit()求出。现在需要进行维护这个数组,使某a项可以加减(乘除),让相应c跟着变。不难看出,跟着变化的是自己树的上层节点,他们的关系是a+lowbit(x) 表示的是 x 在二进制表示下,最低位的 1 的权值。的所有项(比如9,影响9,10,12,16)(比如9,影响9,10,12,16)}//求a1-ax的和。
2025-06-25 14:12:26
127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人