自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(562)
  • 收藏
  • 关注

原创 github/git密钥配置与使用

因为要在ubuntu上做点东西,发现git clone 的时候必须输账户密码,后来发现密码是token,但是token一大串太烦了,忙了一天发现可以通过配置 公钥 来 替代 http 的 部署方式。

2024-10-03 21:34:33 387

原创 前缀和+思维,CF 1984C2 - Magnitude (Hard Version)

否则,答案为 Σ 2^{n - i - 1 - posi},其中 sum[i] == min,posi 为 sum[0, i] 中 >= 0 的 i 的数目。如果我们通过多次操作2使得值变大,那么我们只需保留最后一次操作2仍然能得到最大值。如果min >= 0,那么操作1、2可以随便取,答案为 2^n。我们要得到最大值,执行操作2如果能让值变大,说明当前值为负数。C1 是只要求求最值,通过C1 我们知道 操作2最多。时间复杂度: O(N)空间复杂度:O(N)那么我们预先求出最小前缀和min。

2024-10-03 17:56:09 383

原创 试填+组合数学,CF 1648C - Tyler and Strings

那么对于L,它的贡献就是 cnt * fac(n - L - 1) / c0!cnt 代表 当前可用的 < t[L + 1] 的字符数,cnt 可以通过树状数组来获取。那么 第 L + 1位必须小于 t[L + 1],剩下的可以随便填。ci 分别代表 字符 i 的出现次数,因为会有重复所以要除去。时间复杂度: O(nlogn)空间复杂度:O(n)考虑枚举相同前缀的长度 L。

2024-09-29 17:23:11 366

原创 LeetCode 第417场周赛个人题解

那么根据操作类型可以推出和对称位置的颜色关系(+1还是相同)给定k,我们可以算出k是第几次操作得到的(取log2即可)滑窗可以写,但是写红温了,还是写了沟槽的二分。如上图所示,最终的数组其实就是不断二倍得到的。开5个元音前缀和数组,一个辅音前缀和数组。枚举 i ,二分合法右端点,累计贡献。我们可以建立简单的递推关系。

2024-09-29 12:10:47 568

原创 线段树二分,LeetCode 2286. 以组为单位订音乐会的门票

由于填满的格子不会再次在 scatter中访问,所以是 O((n + q)logn) 的。时间复杂度: O((N + Q)logN)空间复杂度:O(NlogN)对于scatter 我们线段树二分找到第一个不空的,依次往后填。对于gather 相当于找从上往下第一个剩余空间够k的排。对于scatter 相当于找从上往下依次填k个空格。对于gather我们线段树二分找到第一个符合的即可。我们用线段树来维护 区间剩余容量以及区间容量最值。

2024-09-28 23:35:02 514

原创 树上差分详解

差分数组详解,一维二维差分-CSDN博客LCA算法-倍增算法_lca倍增算法-CSDN博客LCA算法-Tarjan算法_lca数组-CSDN博客树链剖分——重链剖分,原理剖析,代码详解-CSDN博客。

2024-09-27 20:26:05 670

原创 树上前缀和详解

前缀和详解,朴素前缀和,前缀和变形,二维前缀和_前缀积-CSDN博客LCA算法-倍增算法_lca倍增算法-CSDN博客LCA算法-Tarjan算法_lca数组-CSDN博客树链剖分——重链剖分,原理剖析,代码详解-CSDN博客。

2024-09-27 16:31:29 280

原创 构造+bfs,CF 761E - Dasha and Puzzle

第二层的点分别向临界点伸边,每条边长度为 2^27,只要方向不往回走,就不会交叉。我们像玩贪吃蛇那样蛇形顺时针内卷的走,如何保证走n - 1次得到的边都不交叉?从0开始bfs 往外向邻接点伸边,每条边长度为 2^28。注意到 平面很大——1e18,而点数 & 边数很小。时间复杂度: O(N)空间复杂度:O(N)我们可以让第一根很长,后面依次减半。如果一个点的度 > 4,那么无解。

2024-09-27 13:19:11 456

原创 二、词法分析,《编译原理》(本科教学版),第2版

POS : '+';NEG : '-';EQ : '=';NE : '<>';LT : '<';LE : '<=';GT : '>';GE : '>=';IF : 'if';;([eE] [+-]?DIGITS)?;

2024-09-27 12:08:22 1118

原创 调和级数枚举+前缀和,CF 731F - Video Cards

然后枚举 x, 2x, 3x....,累加 (acc[kx + x - 1] - acc[kx]) * kx 的和。我们似乎只需要知道 [a * k, a * (k + 1) - 1) 内的数的个数就能计算这个区间内的数的贡献。考虑暴力的想法:从小到大枚举leading,然后暴力计算后面的数 x - x mod a 的和。预处理前缀和 acc[i] 代表 [0, i] 内的数字个数。时间复杂度: O(NlogN)空间复杂度:O(N)我们发现 x - x mod a = a * k。

2024-09-27 11:54:55 339

原创 思维+贪心,CF 1210B - Marcin and Training Camp

然后遍历剩下的数字 x,如果集合中存在某个数字y 满足 x & y = x,我们就把x 拿进集合。所以,我们先将所有 出现次数大于1 的数拿进集合(升序排序,去重即可)考虑一个数 x 不会比集合内所有数都强,可以注意到什么?否则,x 和 每个数相比总有对方没有的,那么就没办法了。时间复杂度: O(nlogn)空间复杂度:O(n)一定有一个数 y 满足 x & y = x。

2024-09-27 10:52:22 413

原创 思维+最小生成树,CF 436C - Dungeons and Candies

假如我们把数据当成节点,每个节点向其前驱连边,我们会得到一棵 k + 1个节点的树。每个数据的前驱是唯一的,对于直接传输的数据我们定义其前驱为虚拟节点。每个节点和其前驱的边权即该节点传输的代价。那么建图然后求最小生成树即可。

2024-09-26 23:25:01 308

原创 前后缀分解+贪心,CF 762C - Two strings

那么我们需要删除的最短长度就是 min{ suf[i + 1] - pre[i] - 1 }去除掉b的一个子串后,b剩下的前缀和后缀一定分别是a的前缀和后缀的子序列。suf[i] 代表 a[i::] 能包含最长的 b[suf[i]::]pre[] 代表 a[:i] 能包含的最长的 b[:pre[i]]本题要输出方案,那么维护下前缀长度和后缀起始位置即可。构建长度为 n 的两个数组 pre 和 suf。时间复杂度: O(N)空间复杂度:O(N)

2024-09-26 20:45:02 446

原创 贪心+构造,CF 761D - Dasha and Very Difficult Problem

即 最小的构造为 l - p[i],次小的构造为 max(l - p[i] + 1, l - a[j])……如果我们知道 c,那么根据 c[i] = b[i] - a[i],我们相当于得到了 b[]以及每个元素的范围:[l - a[i], r - a[i]]时间复杂度: O(NlogN)空间复杂度:O(N)显然越小越好,这样上面的元素容错率越高。我们知道了 c 各个下标元素排名。那么我们贪心的从低往上构造。

2024-09-26 16:40:00 448

原创 枚举+组合数学,LeetCode 2306. 公司命名

我们可以将字符串按照后缀分组,遍历字符串数组,计算每个后缀的重叠 pair(i, j) 数目即可。时间复杂度: O(n(m + U))空间复杂度:O(U^2 + nm)答案是 cnt[i] * cnt[j] 其中 j < i 吗?表示在公司命名过程中使用的名字列表。对于不同的i, j,却有着相同的 s[1::]考虑每个首字符出现次数 cnt[]且有效的公司名字的数目。

2024-09-25 13:43:26 364

原创 LeetCode 第416场周赛个人题解

什么典中典手速场

2024-09-22 12:00:04 446

原创 线段树优化dp,CF 413E - Maze 2D

然后线段树维护的是区间内 (0, l) -> (0, r) (0, l) -> (1, r) (1, l) - >(0, r), (1, l) - > (1, r) 的最短竖移步数。考虑定义 f((li, l), (ri, r)) 为 (li, l) -> (ri, r) 最短路径的竖着走步数。(li, ri) 的可能取值有4个,我们可以作为线段树的节点信息。那么 f((li, l), (ri, r)) = min{对于(li, l) -> (ri, r)如果能到一定要横着走 r - l 步。

2024-09-21 23:56:58 320

原创 AC自动机详解,原理、优化分析,代码实现

填坑ing

2024-09-21 17:47:16 1509

原创 数位dp,LeetCode 2376 统计特殊整数

数位dp如何递推求解?

2024-09-20 10:23:35 589

原创 模拟+分类讨论,LeetCode 2332. 坐上公交的最晚时间

结束后,如果最后一个车没满,那么从最后一个车的发车时间往前倒推,找到一个空闲时间点。所有公交车出发的时间互不相同,所有乘客到达的时间也互不相同。遍历每个车,维护一个乘客指针,只要当前乘客能上车就后移。否则,从最后一个上车的乘客往前倒推,找到一个空闲时间点。每位乘客都会搭乘下一辆有座位的公交车。返回你可以搭乘公交车的最晚到达公交站时间。且公交没有满,那么你可以搭乘这一辆公交。随着来的乘客越来越晚,其能登上的车也就越靠后。辆公交车的出发时间。跟别的乘客同时刻到达。将车 和 乘客都升序排序。到达的乘客优先上车。

2024-09-18 15:47:33 473 1

原创 中位数贪心+分组,CF 433C - Ryouko‘s Memory Note

我们考虑分组—— vals[x] = { 所有x出现位置前后不为x 的值 }改变 x 只会影响所有值为 x 的下标 及其前后下标的贡献。时间复杂度: O(MlogM)空间复杂度:O(N + M)对于x,我们要把x调为何值最优呢?那么我们分组考虑维护最小值。vals[x]的中位数。

2024-09-17 16:31:38 271

原创 二分+构造,CF 1063C - Dwarves, Hats and Extrasensory Abilities

我们考虑开局往左下角或者右下角中的一个位置放一个,这里不妨放右上角即(1e9, 1e9)如果 color(x, x) == col(hi, hi) 那么收缩 hi = x。最终输出 (lo, hi) (hi, lo) 即正方形的主对角线。时间复杂度: O(log U)空间复杂度:O(1)二分x = (lo + hi) / 2。看到 30 和 1E9就往二分上想。这样保证左下右上一定不同。否则收缩lo = x。

2024-09-17 15:57:05 325

原创 LeetCode 第415场周赛个人题解

rank24

2024-09-15 12:00:07 833

原创 单调队列,LeetCode 2398. 预算内的最多机器人数目

那么过程中当 花费 > budget,往右收缩 j 同时根据 j 来弹出队头。维护一个单调队列,队头到队尾chargeTime单调递减,即队头最大。固定右端点r,r右移其合法左端点l不会后退,具有单调性,考虑滑窗。时间复杂度: O(N)空间复杂度:O(N)i 代表窗口右端点,j 代表窗口左端点。维护i - j + 1的最大值即可。由于要获取滑窗最值,考虑单调队列。个机器人,给你两个下标从。个机器人中最大充电时间,个机器人的运行时间之和。运行的机器人数目为多少。

2024-09-13 15:36:42 568

原创 循环节,CF 314B - Sereja and Periods

我们可以暴力找循环节,但是也可以类似于字符串匹配的方式构建nxt 数组 和 cnt 数组。这样对于 (a, b)而言,我们只需模拟a轮,每次O(1) 跳nxt,累加cnt。对于nxt 和 cnt,我们直接暴力构建即可,因为 a 和 b 的长度都很小。时间复杂度: O(b + |a| |c|)空间复杂度:O(|a| + |c|)cnt[i] 代表 从 c[i] 开始 匹配 一个a,匹配得到的 c 的数目。nxt[i] 代表 从 c[i] 开始 匹配 一个a,结束位置的下一个位置。

2024-09-12 22:47:43 359

原创 dp + 计数,CF 1920 E - Counting Binary Strings

那么 f(sum, cur) = Σ f(sum - (cur + 1) * (pre + 1), pre)定义 f(sum, cur) 为 好子串个数为sum,最后一段0的长度为cur,的字符串的数目。时间复杂度: O(nklogn)空间复杂度:O(nk)数目 = 4 * 5 + 5 * 3 + 3 * 6。考虑dp,为了转移我们显然要知道最后一段的0的长度。对于一个01串,我们怎么计算其好子串的数目呢?我们枚举cur 前一个 0串的长度,pre。最终输出 sum(f(n)) 即可。

2024-09-12 21:30:15 361

原创 dp+观察,CF 1864 D. Matrix Cascade

具体实现,我们滚动数组优化f(i, j),然后用diag1[] 和 diag2[] 分别代表主对角线和副对角线的异或次数奇偶性,这样用三个一维数组就能完成求解。我们定义f(i, j) 为 格子 (i, j) 为直角顶点的上三角区域的总操作次数的奇偶性。经过观察,我们操作一个格子,受影响的应该是以该格子为直角向下延伸出的一个等腰直角三角形。如果奇偶性 和 当前格子的值不同,那么需要额外操作一次,所以 f(D) ^= 1。时间复杂度: O(N^2)空间复杂度:O(N)那么 f(d) = d(a) ^ f(b)

2024-09-12 20:37:13 427

原创 贪心+滑窗+递推,LeetCode 2555. 两个线段获得的最多奖品

我们考虑滑窗维护当前线段[i, j],在过程中维护答案 res = max(res, j - i + 1 + pre[i])不会,我们总能将两个相交线段分开来得到更优解。pre[i] 指 [0, i) 内的最长线段。时间复杂度: O(N)空间复杂度:O(N)pre[] 可以在滑窗 的过程中递推。考虑最优解的两个线段会相交吗?

2024-09-11 16:19:44 224

原创 枚举,LeetCode 2552. 统计上升四元组

cnt3[j] += cnt2,因为cnt2 为 (i, k) 的数目,i < j,k = l > i 故合法。我们考虑 枚举 l,维护cnt3[],即 [0, l) 内 (i, j, k) 的数目。在内层枚举 j,维护cnt2,即[0, j] 内 (i, k) 的数目。则 cnt4 += cnt3[j],cnt2 += 1。可以用递推预处理前后缀,但是枚举的方式更训练思维。时间复杂度: O(N^2)空间复杂度:O(N)的所有数字,请你返回上升四元组的数目。如果nums[j] < nums[k]

2024-09-10 21:06:28 424

原创 贪心+构造,1924A - Did We Get Everything Covered?

我们依次将每个全集时刻加入st的字符保存,然后再加上一个非法时不在st中的任意字符即可。我们从头遍历s,用集合st代表出现的前k个小写字母的字符集。如果 st 在某个位置变成全集,说明长度为1的序列是ok的。st 又在某个位置变成全集,说明长度为2的序列是ok的。时间复杂度: O(N)空间复杂度:O(N)我们将st清空,接着遍历。那么如何输出非法方案?

2024-09-10 12:23:47 511

原创 枚举,CF 1895C - Torn Lucky Ticket

如何避免写成石山?

2024-09-10 09:51:49 209

原创 位运算+前缀和+预处理,CF 1017D - The Wu

我们直接暴力枚举所有s和t的可能,两两之间通过 ((1 << n) - 1) ^ (s ^ t) 即可得到相同位的集合,进而得到花费,然后对花费求前缀和即可。时间复杂度: O(2^{2n} + 2^n U + qn)空间复杂度:O(n + m)sum[x],x < 1 << n,当 s 和 t 相同位 = x时的花费。cnt[x], x < 1 << n,cnt[x] 为 x 出现次数。acc[k][t],和 t 相同位 花费不超过k的s的数目。又观察到 n 很小,有点状压预处理的意思。

2024-09-09 20:21:59 364

原创 可持久化Trie详解,最大异或和,k大异或和

因为我们选取的后缀不能空,所以相当于 求 s[p] ^ s[p + 1] ^ …对于查询的部分,因为插入了0,所以 [l, r] 对应 版本/区间 [l + 1, r + 1]那么可以作为次大值的区间就是 [ll + 1, r - 1], [l + 1, rr - 1]因而,我们动态开点,在上一个版本的基础上,增加新的节点,就得到了新版本的Trie。然后我们枚举每个数,记 左边第一个大的为l,第二个为ll,同理有r,rr。因为查询区间是[l, r],所以左边界应该是root[l - 1]

2024-09-08 17:58:11 1469

原创 LeetCode 第414场周赛个人题解

预处理一定记得放到函数外面……

2024-09-08 12:29:07 722

原创 dfs序+线段树,CF 838B - Diverging Directions

如果 v 在 u 子树内,显然从u直接走到v是最短的,答案为 d[v] - d[u]所以,我们只需用线段树维护 dfs序列上的 {up[x] + d[x]}即可。即,答案为 min{up[x] + d[x]} + d[v] - d[u]那么我们发现操作树边,相当于是修改一棵子树的 {up[x] + d[x]}上述路径长度为:d[x] - d[u] + up[x] + d[v]发现我们似乎只需维护 min { up[x] + d[x] }操作回跳边,则是单点修改up[x] + d[x]

2024-09-07 13:58:34 489

原创 一、关系模型和关系代数,《数据库系统概念》,原书第7版

*数据库(Database)**是一个描述现实世界某些事物的互相关联的数据集合,数据库是大多数计算机应用程序的核心部分。

2024-09-07 11:02:33 1336

原创 递推,CF 353D - Queue

手玩一下,我们发现相邻的两个女孩,一前一后,如果前面那个能动,那么后面那个是前面那个时间 + 1。如果遇到女生,如果c > 0,那么res = std::max(res + 1, c)即,时间不会比前面男生数目少,不会比前面女生时间+1早。然后再看最前面的女生,她的时间取决于她前面有多少男生。时间复杂度: O(N)空间复杂度:O(N)遍历字符串,记录当前遇到的M的个数c。

2024-09-06 21:10:44 345

原创 前缀和优化DP,LeetCode 3177. 求出最长好子序列 II

ma(j) 可能会包含 f(x, j - 1),但是由于 f(x, j) >= f(x, j - 1),所以f(x, j) + 1 >= f(x, j - 1) + 1,不影响状态转移的正确性。那么 f(i, j) = max(f(i, j), ma(j)) + 1。f(x, j) 为 以x结尾有 j 个 坏pair 的最大好序列长度。时间复杂度: O(NK)空间复杂度:O(NK)每次从当前列或者左边列转移,我们考虑前缀优化。ma[j + 1] 代表 第 j 列最大值。,那么我们称这个整数序列为。

2024-09-06 17:35:47 479

原创 一、编译引论,《编译原理》(本科教学版),第2版

它同时。

2024-09-06 16:24:07 827

原创 计数dp+组合数学,CF 213B - Numbers

如果j == 0, f(i, j) = Σ f(i - k, j + 1) * comb(i - 1, k)如果j > 0,f(i, j) = Σ f(i - k, j + 1) * comb(i, k)对于0,如果要拿出 i 个位置填0,那么方案数为comb(n - 1, i),因为不能有前导0。于是定义状态 f(i, j) 为 剩余 i 个位置,填写数字j, j + 1...9的方案数。对于1,如果要拿出 j 个位置填0,那么方案数为 cnt(n - i, j)显然可以滚动数组优化。

2024-09-06 12:26:20 469

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除