Loading

dash

题单链接

2025.8.18

P13273 NOI2025 数字树 - 洛谷 未完成

一套题,未完成

2025.8.19

2129E. Induced Subgraph Queries

可以算是独立相出。但是有两个不顺利的地方

  • 想了很多错误的方向,可以说是枚举了各种可能的方法组合。
  • 卡了许久的常数,开始是因为数据结构没使用好,后来最有用的是去掉define int long long,这个确乎是会影响时间的。
  • 这道题最关键的一个点是在调整原先的莫队,并且同时进行两个莫队,且由于坐标之间的关联,复杂度是根号

Submission #334485483 - Codeforces

2128E2. Submedians (Hard Version)

唯一需要想到合法的答案构成区间。

考虑的方法是邻域调整,即不是考虑任意两个区间关系,而是考虑一个最微小的变化,以及这个微小变化带来的影响,这样就简单多了。

Submission #334501846 - Codeforces

2128F. Strict Triangle

有两点没想出来看了Hint1,2

  • 如果我直接对整个图考虑是非常难的,因为一个“图”是一个极其庞大且抽象的对象,所以正确的做法是,根据定义,假设答案存在,找到原题真正关心的东西。整体考虑图的染色情况,就是我无法下手的原因。

    比如本题,真正关心的是某一条不经过k的最短路径,并且为了分析,我应该找到具体的某一个,而不是仅仅知道“存在”。

  • 条件的放宽。当限制条件是对于所有元素满足某某性质,那这个性质不一定是真正的严格限制。类似于:

    真正的限制:\(\forall x,A(x)\) 成立,而我可以找的是 \(\forall x,B(x)\) 成立,且 \(B(x)\)\(A(x)\) 的一个必要条件。

    单看某个条件是不对的,但是合起来就对了。之前讨论过这种转换,但要在实战中打出还是很难的,需要先猜后证?

    由于这种转化的本质是让条件变得好看,所以我可以往一些比较好看的 \(A(x)\) 的必要条件上猜,且不要轻易否定一个结论。

    这让我想起另一类相似的转化:求 \(\max_x A(x)\),转换为求 \(\max_x B(x)\),同样满足 \(B(x)\)\(A(x)\) 的充要条件,当时当 \(B(x)\) 不满足时,一定不会变成答案。比如NOIP2024T4。

Submission #334526366 - Codeforces

2025.8.20

2127H. 23 Rises Again

看了完整题解,原因是没思路+读错题,两点:

  • 状压做图论计数时,一般会有 \(f,g\) 分别表示图/联通子图方案树,并且根据题目对图的额外限制,可以增加很多新的维度
  • 神奇的环限制,考虑树图转换,分开研究树边/非树边的性质

Submission #334621771 - Codeforces

image-20250820145322050

F. Hamed and AghaBalaSar

算是自己做出来的,有个难点,就是要注意到前 \(n-1\) 个格子等价,然后用所有各自的贡献之和除以 \(n-1\) 算出单个格子的贡献,这个直接推式子比较难,整体用意义做更简单。

Submission #334638009 - Codeforces

image-20250820165630948

G. Maximise Sum

关键问题在于:

  • 没想到值域<=n,以此来限制合法对(i,j)的个数

  • 虽然权值改变很复杂u,但是只要找到第一个k,整个计算就与 a_j无关了,、可以预处理,而不是向我一样重新算

Submission #334665352 - Codeforces

image-20250820205929188

2025.8.21

F. Appending Permutations

原思路还是会算重,因为把结构套的太复杂了。用以下技巧可以简化:

  • 按照易于处理的方式安排枚举顺序,或者枚举其中计算得到的某些变量。
  • 去重的时候找到一个”重复点“,使得重复的成因与其他地方操作无关,这样就可以用乘法乘起来,比如本题处理了一个 \(h[j][i]\),表示出现了先大后小的两个同位循环位移,这与 \(j\) 之前的无关,所以可以之间将 \(f_i\) 减去 \(f_{j-1}\times h[j][i]\) 来去重。
  • 先算离线转移贡献,再转移。在转移 \(f_{i}=\sum_{j<i}f_jVal(j+1,i)\) 中,\(Val(j+1,i)\) 单次计算为 \(O(n)\),但是将 \(i-j\) 相同的 \(Val(j+1,i)\) 一起计算,可以实现均摊 \(\mathcal O(1)\),所以应该先离线算 \(Val\) 再转移 \(f\)

Submission #334739496 - Codeforces

image-20250821123132626

G. Eulerian Line Graph花了5个小时,失败了,我证明不了题解的结论。以后选题不要选Down了一堆的比赛里的题。这道题的各种结论感觉很大程度上是手玩而非证明。也有启发就是要有目的性的进行手玩,并不断总结,不要盲目手玩。

P7962 [NOIP2021] 方差 - 洛谷

  • DP的时候很巧妙,没有对转化后的式子进行DP,而是DP了原式,存 \(\sum a\),作为状态反而更加简单粗暴。

  • 并且这里使用动态位置也可以减少状态,即动态插到当前维护的数组的左右两边,而非实际插在数组的某个位置。

记录详情 - 洛谷 | 计算机科学教育新生态

D. Permutation Blackhole

还算可以的区间DP,设计DP得先找性质,再根据性质设计DP,什么性质都没有,就只能枚举,是不能DP的。

Submission #334971639 - Codeforces

image-20250822085703365

2025.8.22

Problem - 2122E - Codeforces

还是说先分析性质,才能设计DP,列出转移式再优化转移。

Submission #334975990 - Codeforces

F. Shifts and Swaps

  • 想到在变化的时候什么不变,然后不断地修正+补充,最后得到答案。

  • 还有就是学习xorShift算法,乱搞的一个随机函数被卡了

  • 我忘记了最小表示法,最小表示法的求解是需要一定分析的串串理论,值得反复温习。

Submission #335006085 - Codeforces

image-20250822170843125

D. Gellyfish and Forget-Me-Not

  • 对于choose A or B 的问题,可以先假设 choose A,然后再判断是否 choose \(B-A\) 即变化量。

  • 有个与线性基相关的性质,由于不论前面的数怎么选,总是后面的数可以基于前面的数做决定,比如对于两个数 \(x,y\),他和 \(x\oplus y,y\) 这样一对数是等价的。

    从线性基的角度解释,根据博弈论理论,一个数的决策仅与后面的数和自身进入时的初始状态有关,然而当前这个数异或上后面的某个数后,其构成的张成空间没有改变。所以原来能达成的方案,再异或上后面的数后,可以通过调整后面的数的决策,达到相同的等价情况。

Submission #335034206 - Codeforces

image-20250822205812113

E. From Kazan with Love

怎敢想?维护可行集合的 \(\Delta\)。然后势能分析。看起来暴力其实就对了。

Submission #335102445 - Codeforces

image-20250823105644462

2025.8.24

G. Divisible Subarrays

大小关系->01序列

Submission #335293726 - Codeforces

image-20250824191737360

第一周总结

AC14题(CF2800 4题,CF2600 3题,CF3100,CF3200 各2题,CF2900,CF3000,洛谷紫题 各1题),放弃1题。

2025.8.25

AT_codefestival_2016_final_i Reverse Grid - 洛谷

  • 每一行和每一列作为一个点,以交叉处的信息建边
  • 如果一次操作的影响太大,可以看对于每一个影响是怎样的

开始时间:16:20,AC时间19:00,其中18:00-18:45在吃饭。

Submission #68805524 - CODE FESTIVAL 2016 Final

2025.8.26

Problem - 2109F - Codeforces

开始时间2025.8.25 19:03,22:35走了,WA on test 5,第二天7:34开始,10:48结束.开始大约1.5个小时读错题了。

  • 洪泛法好
  • 最小割转最短路:
    • 平面图最小割=对偶图最短路
    • 网格图最小割=另一个方向的最短路

Submission #335536966 - Codeforces

image-20250826105036780

Problem - E - Codeforces

显然可以直接用DP求出执行操作2的最小次数。但是记录方案的代码十分复杂。

考虑到,出现非链的情况,至少需要4个点,于是我们直接尝试构造链。然后将点按照链端,链中间,非链染色。

经过一些讨论,但无论如何,使用操作2,就一定有另外三个点,那么操作2就是 \(\lfloor\frac n4\rfloor\) 次的。

Submission #335538726 - Codeforces

image-20250826111700190

Problem - 2108F - Codeforces

开始于14:24,AC于16:37

如果要打表

我们一直说打表,打什么内容是十分关键的,这又取决于我们关注什么。

这个题的操作十分复杂,所以我们应该先关注什么样的序列是可以得到的,而非直接关注答案是怎样的。

将整个打表内容排序,也是非常好的方法。

在完全不知道结果前,从什么角度看打表内容也十分关键。更重要的是不要当作“偶然”。

所以还是要积累一点常见的角度。

打表对象:什么样的序列能生成

打表方法:排序

观察角度:如果一个生成,他所有的“子集”也可以生成.这里的"子集"是某种角度下的可重集.

如果要分析

这个结论也能分析出来,关键在于要考虑一个合法的结果是可以怎样生成的

考虑如果“我要让一个位置的值为 \(v\)”,那么应该怎样操作,这是就不要考虑其他的位置了。

Submission #335569148 - Codeforces

image-20250826163734419

Problem - 2107F2 - Codeforces

开始于 16:40,18:04吃饭,18:57回来,20:22AC

自己做出,比较平凡。

Submission #335600668 - Codeforces

image-20250826202236464

2025.8.27

Problem - 2097D - Codeforces

8:37开始,10:44AC

自己做出,比较平凡。

Submission #335742933 - Codeforces

image-20250827104514450

Problem - 2092F - Codeforces
10;50开始,12:14去吃饭,14:12回来16:53AC

  • 什么时候该换个思路呢?至少不应该吊死在一棵树上
  • 在数据范围极大时(1e7级别),把vector换成邻接表可以大力卡常
  • 优化空间复杂度也需要分析性质。

Submission #335776129 - Codeforces

image-20250827170313737

Problem - 2101E - Codeforces

17:06开始,18:06去吃饭,18:55回来,20:22AC

  • 换掉vector,常数就除2
  • 在处理“排除本集合元素的最大值“时,可以直接用pair<int,int>维护最大值,和另一个所在集合不同的次大值,而不是用值域线段树,麻烦还多 \(\log\)

Submission #335805004 - Codeforces

image-20250827202513466

2025.8.28

巡逻网络 (net)

  • \(|a-b|=\max(a-b,b-a)\),于是在求最大值时,不需要考虑相对大小,只需要保证最后取到那么多个 \(-\),那么多个 \(+\) 。在最优化问题中把绝对值化为最值。
  • 减少循环个数可以卡常,这是因为减少了jump的次数,而jump是不连续访问,十分耗时

记录详情 - 洛谷 | 计算机科学教育新生态

【USsR #1】彩色括号 - 题目 - Universal Online Judge

  • 把变量设出来,形式化列式,在这过程中,需要考虑大量情况,并用一些变量表示
  • 线性规划之类,最优值一定取在某条线,或某个点上,证明考虑移动最优值位置,类似单纯形法(把算法忘了,需要复习)。这样即使暴力,也可以联立求解某条线,某个点,缩小答案空间。这往往要画函数图像。

提交记录 #789136 - Universal Online Judge

2025.8.29

符文石

图上整体二分,每次二分出一个贡献集合 \(S\) 与待更新集合 \(T\),每次 Check 如果要从 \(S\) 走到 \(T\),则为 \(O(n)\),TLE。正确做法将 \(S\) 上的点挂在 \(T\) 上(每次二分集合时进行),这样复杂度为 \(O(|S|+|T|)\) 复杂度正确。并且结合性质分析复杂度。

小 L 造数据

对于 \(x\bmod p\),在 \(q\) 进制下 \(x\bmod p\bmod \operatorname{lowbit}_q(p)=x\bmod \operatorname{lowbit}_q(p)\),即 \(x\bmod p\) 不影响 \(q\) 进制下 \(p\) 后面最低的几位为 \(0\) 的位的值,证明考虑把 \(\div\) 看作 \(-\) 可以证明。

记录详情 - 洛谷 | 计算机科学教育新生态

Problem - 2097E - Codeforces

跳到下一个大于 \(x+d\) 的白点,可以将白点 \(x\) 连到 \(x+d\),将黑点 \(x\) 连向 \(x+1\),这样一路上跳到的白点就是原问题了。一个建边技巧,即用非关键点建立结构,关键点产生贡献。

Submission #336199408 - Codeforces

image-20250831184442404

第二周总结

1洛谷紫,1CF2500,2CF2800,3CF2900,1CF3000,2CF3100,1UOJ,3模拟赛题=14题

2025.9.1

模拟赛总结:挂大分,告诉我们过了样例 \(\implies score\in [0,100]\)。所以要对拍。

P11504 [NordicOI 2018] French Fries - 洛谷

首先除太多数太小,用打表得到一个范围,即\(\le 10^5\)

然后就是用 double 存大数

于是有 \(74\) 分。

神奇误差分析。将 \(\frac {mx}{mn}<D=1.25\) 的修改全部变成 \(\sqrt{mx\times mn}\),然后误差分析就是对的。
由于单调,假设整体最大值为 \(MX\),最小非0值为 \(MN\),则有 \(\log_D{\frac{MX}{MN}}\) 段。由于 \(MX\le 1\),当 \(MN<10^{-10}\) 时就没用了,直接设作 \(0\),复杂度就是对的。

记录详情 - 洛谷 | 计算机科学教育新生态

Problem - 2119F - Codeforces

  • 直接考虑最后停在哪个点。然后通过分析得到答案与最后停在哪个点的关系。抽象来说,直接考虑终点状态

  • 但是怎么到这个点,便要考虑过程。

  • 精细实现,不然就会有很多情况,使得写的和想的不一样。

Submission #336492030 - Codeforces

P10644 [NordicOI 2022] 能源网格 Power Grid - 洛谷

非常高妙。

  • 发现充要条件并转换,先找到必要条件(再显然也要找),然后证明其充分性,对于这种构造题,可以构造证明
  • 若要满足多个条件,先假设满足一个条件,再用“调整法“调整至满足另外一个条件,并且在调整的过程中保证第一个条件一直满足。这也是一种 微小调整法。这样可以转化条件。
  • bitset优化背包。

记录详情 - 洛谷 | 计算机科学教育新生态

2025.9.2

模拟赛总结:T1想了太久(1.5h)导致没时间细想T2,结果本来就没有更优的解法了。如果一段时间想不出来就不要想了,有可能本身就是题目的问题。

因子操作

image-20250902145052110

image-20250902145106037

  • 势能性:一个数只会减少,有不会低于某个下界,那么他的操作次数就有限了。

  • 神奇复杂度的分析:以实际结果为准,比如此题的此算次数就是 \(\mathcal O(\sum_{i=1}^np_i\min\{\frac{n}{x},w\}^2)\),其中 \(p_i\) 就是最初的答案,这就需要先写出来用程序跑出 \(p_i\)。”小 L 造数据“一题的自由元个数,也要先设计出算法,然后跑出来得到,因为 xor shift 的 rand() 函数太随机了,难以分析。

  • 如果只相当 \(x\) 小时 \(d(x)\) 也较小,采用“根号”分治,阈值为 \(D\)

    • \(x\le D\) 时刻算出最优答案
    • \(x>D\) 暴力向前跳。

    不知道复杂度,但可以过。此方法David_Mercury有记载。

Problem - 765F - Codeforces

18:53开始19:14看题解20:01AC

线段树做法(性质做法)

首先考虑 \(j<i,a_j>a_i\),做完后将 \(a_i\) 取相反数再做一次即可。

我们有一种经典的扫描线的技巧,即扫描 \(r\)\(b_i\) 表示 \([i,r]\) 的答案。最朴素的是扫描 \(r\) 时,直接向前做区间修改。

这道题,需要进一步的分析,也就是说,我们不能直接简单粗暴的用区间进行修改。

于是我们考虑怎样的修改是有效的,这里的有效包含两重意义:对 \(b_i\) 产生修改和对全局答案产生影响。

首先分析 \(i\to j\) 的条件,假设之前是 \(k\to j\),发现“ \(b_i\) 发生修改”当且仅当 \(a_k<a_i\)。然后就没有性质了。

一个技巧是考虑同时存在多个转移的条件,假设同时存在 \(i\to j,i\to k\) 的更新,这里设 \(k<j\)。于是 \(i\to j\) 的更新可能对 \(i\to k\) 的更新产生影响,首先若 \(a_k\ge a_j\) ,从“对全局答案产生影响”的角度则不会有转移 \(i\to k\)

顺着这个思路,如果 \(j,k\) 之间的答案优于 \(i,k\) 之间的答案,那么 \(i\to k\) 也可以不存在,于是 \(i\to k\) 存在则要求 \(a_k-a_i<a_j-a_k\implies a_k-a_i<\frac12(a_j-a_i)\) 于是得到每多一个转移,值域减半,复杂度变为 \(\mathcal O(n\log^2 V)\)

莫队做法(火箭毛毛虫做法)

直接用莫队,需要维护一个有序序列,和带删除的最大值,是 \(\mathcal O(n\sqrt m\log n)\) 的。

把莫队换成回滚莫队,只加不删,于是“带删除的最大值”就不用set了。考虑如何维护有序序列,并且支持查询前驱后继。

为了平衡掉 log,自然用值域分块,将贡献看作块内于块间。假设块长为 \(B\),那么块间的前驱后继直接维护最小值与最大值即可,维护后在每次询问时遍历所有块。

块内找后继暴力是 \(\mathcal O(B)\) 的,我们放到每次修改做。这样复杂度就是 \(\mathcal O(n\sqrt mB=\frac{nm}{B})=O(nm^{0.75})\),然而找块内找后继这一步可以用bitset,复杂度就是 \(\mathcal O(nm^{0.75}/\sqrt w)\),可以过。

  • 用值域分块平衡莫队的log
  • 用bitset找后继。凡是01序列都可以用bitset

分块做法(更强的火箭毛毛虫)

分块,对块内元素排序。

预处理预处理出\(f[i][j]\)表示一个数在第\(j\)块到\(i\)所在块的上一个块这部分,另一个数在\(i\)所在块的以\(i\)结尾的这部分前缀,他们之间能产生的最小答案。\(g[i][j]\)表示一个数在\(i\)所在块的下一个块到第\(j\)块这部分,另一个数在\(i\)所在块的以\(i\)结尾的这部分后缀,能产生的最小答案。令\(s[i][j]\)表示第\(i\)块的开头到第\(j\)块的末尾的答案。

询问还是分成 4 大类讨论:整 \(\to\) 整:差s数组。散 \(\to\) 整,整 $\to $ 散:查 \(f,g\)。散 $\to $散:直接归并,单次 \(\mathcal O(\sqrt n)\)

\(f,g\) 需要求,每个数对每个块的贡献,由于块内排序,我们可以对一个块内的所有元素到其他块的答案一起处理。每次双指针做到 \(\mathcal O(n\sqrt n)\)

\(s\) 则又根据 \(f,g\) 递推得到。复杂度 \(\mathcal O(n)\)

最后就是 \(\mathcal O((n+m)\sqrt n)\)

  • 分块,块内排序
  • 处理散整数组,即一散块对其后面连续的整块的贡献。

Submission #336614286 - Codeforces

image-20250902200538966

2025.9.3

P9331 [JOIST 2023] 护照 / Passport - 洛谷

考基本的最短路知识。

  • 到达多个点的最短路,一定是前面走了一段相同的,然后逐渐分离走向各自的终点,形如一棵树,这里到达两个点,只需要从这两个点开始建反图跑最短路即可。
  • 求多点(多次询问单点)到多点的最短路就是多源最短路

记录详情 - 洛谷 | 计算机科学教育新生态

P11392 [JOI Open 2019] 三级跳 / Triple Jump - 洛谷

11:50开始,11:21吃饭,14:10到,14:35AC

自己做出

成功独立使用了”考虑两个同时存在的可行方案“与”分析目标状态性质“这两个角度分析。

后面知道这个就叫做”支配点对“,就靠调整法证明。

记录详情 - 洛谷 | 计算机科学教育新生态

P4458 [BJOI2018] 链上二次求和 - 洛谷

14:41开始17:09AC

自己做出

太搞了,\(u\) 可能大于 \(v\),在转化题意时需要注意输入限制,比如不保证 \(l\le r\)

记录详情 - 洛谷 | 计算机科学教育新生态

P7214 [JOISC 2020] 治療計画 - 洛谷

17:25开始,18:00走,18:40回来。第二天AC

最后没有想到[NOI2019] 弹跳技巧——Dij的本质与数据结构维护剩余集。

记录详情 - 洛谷 | 计算机科学教育新生态

2025.9.4

Problem - 1270H - Codeforces

两个角度都对了,但是没有转化成功

01序列

一个01序列形如 \(11...1100...00\) 的充要条件是有且仅有一个 ”\(10\)” 子串存在。

下降集合

这个做法我导出了 2\(\log\) 的线段树套可持久化平衡树做法。

需要发现一个观察:假设题目给出排列,那么设 \(b_i\)\(i\) 的前缀最小值,那么答案就是 \(b_i=(n-i)\) 的个数。这时可以维护 \((\min_{1\le j\le i}a_j)-(n-i)\) 的最大值及最大值个数,后者为答案。

🚨 waiting to solve 🚨

Submission #336836506 - Codefrces

image-20250904151632101

Problem - 627E - Codeforces

  • 常数umap>vector>array
  • "好的暴力是重要的,简洁的暴力容易优化"
  • “根据题目的特殊点找思路,比如本题 \(k\) 很小,于是想与 \(k\) 有关的性质与思路”。

Submission #336851092 - Codeforces

image-20250904174145526

P9528 [JOISC 2022] 蚂蚁与方糖 - 洛谷

考察了Hall定理,以及一个分析性质。

  • 两个修改操作同时执行,单独看每个都很难处理,但是放一起看就有了性质。

记录详情 - 洛谷 | 计算机科学教育新生态

2025.9.5

模拟赛总结:

分数220(90+30+100+0),排名18,期望得分 300(100+100+100+0)

第一题没有算空间MLE了,用容斥可以减少记录

第二题数组开小了,但开大后也只有 \(60\),复杂度为 \(nm(n+m)\log nm\) 应该是多了个 \(\log\) 导致TLE。大样例跑 \(5.5s\),时限 \(3s\)。这还不如之前想的暴力。

考试时间分配:30'T1+30'T2+130'T3+80'T2,NOIP的比赛时间还是太紧了。

Island Hopping - CodeChef ISLNDHOP - Virtual Judge

这是一个网格图,贡献是 \(|x-X|+|y-Y|\),可以直接拆绝对值+DP而不是用BFS。

Solution: 1188309848

P9530 [JOISC 2022] 鱼 2 - 洛谷

  • 性质:若 \(y>x\),则 \(y+x>2x\)。利用这个性质,每次值域翻倍。

记录详情 - 洛谷 | 计算机科学教育新生态

CF573E Bear and Bowling

18:12开始,22:11没写出来走了

现在老是想线段树,线段树维护不了就觉得做不了,都没想过分块,想分块一下子就简单了。

调试问题:仅能保证a升序,无法保证b,但后来以为也是按照b升序的。

调试心得:将每一步进行时,前面已经满足的前提以注释写出来。

Submission #337929659 - Codeforces

image-20250910174315646

2025.9.11

丁香之路

一条路径->欧拉路径->处理度数

R235016210

2025.9.12

P4632 [APIO2018] 新家 - 洛谷

17:25-21:35

自己做出,思路见注释,运用”从特殊情况想起“可以解决。

记录详情 - 洛谷 | 计算机科学教育新生态

posted @ 2025-08-19 07:26  lupengheyyds  阅读(83)  评论(0)    收藏  举报