NOIP 2026 长训营
前言:8.30下午得知被抓来集训,不是特别开心,回不到教室见不到同学,但是 FANER 和 CR 都比较支持我,还是感觉比较行,况且我暑假集训期间模拟赛也都还行,那就这样吧
Day1 - 8.31
1.P11491 [BalticOI 2023] Tycho
比较弱的一道 dp。考虑观察数据范围可以得到状态 \(dp_i\) 表示走到第 \(i\) 个点等到 \(p\) 的倍数秒受到的最小伤害,转移是显然的 \(dp_i=dp_j+\left \lceil \frac{a_i-a_j}{p} \right \rceil \times p+ \left \lceil \frac{a_i-a_j-1}{p} \right \rceil \times d\),然后观察一下发现 \(\left \lceil \frac{x+y}{p} \right \rceil\) 和 \(\left \lceil \frac{x}{p} \right \rceil + \left \lceil \frac{y}{p} \right \rceil\) 差值是 \(O(1)\) 的,所以把转移里面和 \(j\) 有关的项拆开,分讨 \(a_i \bmod p\) 即可。线段树可做到 \(O(n \log n)\)
2.P3059 [USACO12NOV] Concurrently Balanced Strings G
你发现把 ( 看作 \(1\),把)看作 \(-1\),以此记前缀和 \(sum\),那一个合法括号序列 \([l,r]\) 即满足 \(sum_{l-1}=sum_r\) 且 \(sum_{l-1} \le sum_i (l \le i \le r)\)。但是你发现有了这个之后你因为有多个字符串所以依然不好统计。然后就毫无头绪的手玩了半天,发现了一个更强的性质:合法括号序列满足序列和 / 最小前缀 / 最大后缀均为 \(0\)。然后直接很自然地分治,发现最小前缀和最大后缀互相约束,不会出现跨过分治中心不合法的情况,所以直接哈希即可,我比较懒用的 array<int,11>
一道非常好的题,这个性质非常强
3.QOJ 7943 LIS on Grid
还真有人出 Dilworth 定理的题啊我去 dsa
Dilworth 定理:最小链划分=最大反链 或 最大链=最小反链划分
然后不会了,我是区,对着题解捣鼓半天也没看出个什么,大概就是二分然后套一下 Dilworth 然后贪心构造,但是我是区
4.P5305 [GXOI/GZOI2019] 旧词
发现深度的幂次不好做,于是先拆掉,考虑 \(k=1\)。然后有个显然的 trick 就是对于点对 \((u,v)\),把 \(u\) 到根上每个点权值 \(+1\),那么 LCA 的深度即为 \(v\) 到根路径上点的权值之和,\(k=1\) 就做完了。扩展的时候考虑 \(k=1\) 的特殊点在哪里,发现我们之所以 \(+1\) 是因为 \((d+1)^k-d^k=1\),于是我们只需要对于每个点 \(i\) 改为加上 \(dep_i^k-(dep_i-1)^k\) 即可,显然扫描线+树链剖分是好维护的
5.CF193D Two Segments
傻子出题人何意味?
考虑两种处理方式,枚举序列区间和值域区间。推了10min+观察题面限制发现第一种做法没啥前途,直接考虑第二种。显然可以枚举一段值域的右端点,那么我们只需要对于 $l \in [1,r) $ 的左端点,查询可以被分成 \(\le 2\) 段的数量。考虑加入一个值域右端点的时候,本质上是对值域邻域的区间做了合并也就是区间\(-1\) 的操作,直接搬上线段树区修区查即可。
6.QOJ 5357 芒果冰加了空气
CR锐评:根本就不是人做的题。那些A了的都没搞懂
神秘点分树,我说实话完全理解不了题解里面把点分树上的深度放进状态里的意义是什么,这个深度完全没有任何可以想到被放进状态或者在状态里做贡献的理由,而且这个点分树也并不自然,即使原树形态没用也不能容易地转移到点分树上做 dp。但见过这种套路以后也还是可以用
我来集训他告诉我高一新生太多不给我安排住宿,导致中午没地儿住只能滚去阅览室,还好晚上之前安排出来了,中途还把我分进新高三宿舍我不知道何意味
对于不能回渝北见到同学表示非常遗憾,感觉一直连上竞赛的节奏我还是切不过来,有点晕
Day 2 - 9.1
八中-梦熊联合训练 梦熊联盟 NOIP2026 模拟赛
1.双网通行 traffic
乐乐分讨题,瞪了4分钟结果没看到 \(A_i \in \{0,1\}\),看到后花费 0.01 秒切掉
2.栏目排列 sheet
看到数据范围一眼状压 \(O(m^22^m)\),发现从一个状态转移到另一个状态时不好维护连续段,进行神秘转化:最小连续段数 = \(1\) 的个数-最大相邻 \(1\) 个数,\(O(m^2)\) 预处理即可。有个小 trick,就是枚举上一列的时候发现可以 __builtin_ctz 枚举当前集合,算是个小优化
3.序列消除 erase
怎么 A 了一车??
考场上毫无头绪,感觉像是个类树结构上做 dp 的东西,但是玩了半天玩不出来,就只打了 50 分
观察数据范围,发现 \(1 \le a_i \le 20\),启示我们考虑值域复杂度做法。多组询问显然是把询问离线下来扫描线,考虑移动右端点计算每个左端点的答案。发现每个答案都可以拆成 20 个不同颜色的贡献之和,考虑维护这样的结构。右端点移动时我们需要考虑三件事情:新增左端点 / 更新 \(c \ne a_r\) / 更新 \(c=a_r\),分别对应了单点赋值,区间颜色替换和前缀区间乘,显然线段树即可。乍一看复杂度是不对的,因为操作二要更新到叶子节点,但是发现每个叶子只会被更新一次,复杂度就保证了
考场想到了一半吧,就这个分析因子的前缀区间乘没有看出来,也没仔细证区间颜色替换的复杂度,觉得没啥前途就丢掉了
4.停机检查 halt(P14880 [ICPC 2019 Yokohama R] Halting Problem)
气死我了暴力加个 if 保证一下次数凭什么就给 96 啊,我纯暴力只拿了个 52
发现 A~E 性质给的很暴力,感觉没什么启发,F 性质这个 \(d_i=0\) 感觉没有什么意义,但我们考虑一下每个 \(a_i\) 的限制最多被走一遍就发现这启示我们建模成基环树,然后只需要 \(O(n)\) 离线询问从 \((x,i)\) 出发,下一次出发 \(a_j\) 的判定是何时何地,然后分讨环上和链上 dfs 或者暴力算即可。但是我觉得这个基环数状物有点抽象了,这个东西也没有理解得很深刻就没打
100+100+50+52=302/400,今天部分分给的太足导致被打爆了,我是区
下午补完 T3 之后感觉一晚上研读 T4 有点无意义,就自己找了几道题
好题要做
1.AT_agc027_d [AGC027D] Modulo Matrix
萌萌构造题,比较聪明
发现这个限制条件比较粪,只能考虑黑白染色,这样我们发现同色点互不影响,然后这个最大最小值互换也不好处理,所以我们钦定黑点的值大于四周的白点。然后你发现我们如果要考虑 \(a_{i,j}\) 互不相同,最好的处理方法就是给每个白点弄成质数乘积,然后很自然地发现白点是斜线排列的,所以给主副对角线弄上 \(O(n)\) 个质数即可。黑点是朴素的,你发现把黑点弄成四周白点的 \(\operatorname{lcm}+1\) 即可,这个东西等于四个质数乘积所以一定是不会重的,换一下顺序就能卡进 \(10^{15}\)。最后把 \(n=2\) 判掉就行了
2.P17304 [ICPC 2026 Xi'an I] XOR and LCA
借着这道题学习一下 LCA 的小清新结论
对于换根为 \(\operatorname{rt}\) 后的树,有 \(\operatorname{LCA}_{rt}(u,v)\) 为 \(\operatorname{LCA}_{1}(u,v)\),\(\operatorname{LCA}_{1}(u,rt)\),\(\operatorname{LCA}_{1}(u,rt)\) 三者中原树深度最大的一个 / 唯一不同的一个
证明考虑一个 \(\operatorname{LCA}\) 的性质,即树上三点两两求 \(\operatorname{LCA}\),一定有至少两个是相同的且重复的那个节点是第三者的祖先,然后你对新根 \(\operatorname{rt}\) 有关于 \(\operatorname{LCA}_1(u,v)\) 的位置分讨即可,具体来说你可以考虑新根 \(\operatorname{rt}\) 是否在 \(\operatorname{LCA}_1(u,v)\) 的子树内,不在的话显然没影响,答案即为 \(\operatorname{LCA}_1(u,v)\),在的话就记录从 \(\operatorname{LCA}_1(u,v)\) 走到新根 \(\operatorname{rt}\) 的路径上的第一个子节点 \(\operatorname{son}\),看 \(u\) 和 \(v\) 哪个在 \(\operatorname{son}\) 的子树内就取它和新根 \(\operatorname{rt}\) 的 \(\operatorname{LCA}\) 作答案即可
这样,如果有些题我们只需要换根后 \(\operatorname{LCA}\) 有关的信息,可以做到 \(O(\log n)\)
对于这道题,我们套用证明过程中的引理,有 \(\operatorname{LCA}_{u \oplus v }(u,v)=\operatorname{LCA}_1(u,v) \oplus \operatorname{LCA}_1(u,u \oplus v) \oplus \operatorname{LCA}_1(v,u \oplus v)\),然后带回原式,容斥一下发现答案为 \(\oplus_{0 \le u \le v < 2^n} \operatorname{LCA}_1(u,v)\),求一下子树大小就行了
Day 3 - 9.2
必可周赛-纯正 OI 味道 NOIP 模拟赛第 4 场
两天两场的来了
1.披萨晚宴 oven(P16540 [EGOI 2026] 披萨大师 / Ovenmasters)
凭啥才绿啊,凭啥放 T1 啊
哦哦原来升青了哦哦。凭啥才青啊
你考虑每次放东西之后每张桌子的相对大小是不变的,所以只需要用 \(m\) 个指针指一下然后排序模拟就可以了
2.分层编辑器 editor(P4732 [BalticOI 2015] Editor)
凭啥放 T2 啊
假设第 \(i\) 次撤销操作要撤销的是操作 \(j\),那么显然 \(i\) 到 \(j\) 的操作中不存在级别比 \(j\) 小的,所以 \(j\) 到 \(i\) 的操作不会在 \(i\) 被撤销之前被撤销
那这个就是一个类似单调栈的东西,考虑可以用主席树维护,查询的时候二分即可
3.画布 canvas(P9261 [PA 2022] Płótno)
考场离正解只差一步TwT
很显然的扫描颜色右端点,然后你发现固定左端点,新加入一个点的时候,我们称关键点为与该点八连通的五个点,只有关键点会对当前局面的联通块个数产生影响,可以压成 0~31 快速算出联通块变化量。然后你考虑你对于固定的区间 \([l,r]\),\(r\) 的关键点最多有 \(5\) 个,而不是关键点的点都对联通块数量无影响,所以一个区间至多被分成 \(6\) 个子区间,分别区间修改即可,线段树是好维护的。
最后就是这个环的问题,考场上也就是没想到这个,考虑我们这样算,当一个点加进来之后,如果形成了一个 \(n\) 列的大联通块,那么本次联通块个数变化量应该是 \(0\) 而不是我们所计算的 \(-1\),但是你发现当这样一个结构形成之后,不会再加入某个点导致联通块数量变化,数量始终是 \(0\),所以只需要记录前 \(k+1\) 小值,然后把 \(0\) 的个数累加到 \(1\) 上即可
4.快速旋转 express(QOJ 9963 Express Rotations)
考场偷了 25 分就跑了,到现在都没搞懂(但是我考场明明打的 35 啊,怎么还吃分呢)
100+20+40+25=185,依旧()
好题要做
P9963 [THUPC 2024 初赛] 前缀和
这个东西有两种理解方式
一种是你考虑这个 \(x_i\) 的意义实际上是不断重复一件概率为 \(p\) 的事情成功一次期望需要多少次,直觉感受发现这等于 \(\frac{1}{p}\),所以这相当于用 \(x_i\) 覆盖区间 \([l,r]\),感受一下这就是 \(\frac{r-l+1}{\frac{1}{p}}=p(r-l+1)\)。或者你考虑现在有一排灯,每个都有 \(p\) 的概率亮起,那么亮起的灯之间的距离就是 \(x_i\),再发现前缀和就是第 \(i\) 个亮起的灯的位置,所以就是 \(p(r-l+1)\)
或者你也可以考虑用错位相减和生成函数基础知识证得 \(x_i\) 的期望等于 \(\frac{1}{p}\)。但是这些做法都太直觉了,我们应该动用一点数学知识
考虑 \(x_i\) 的 PGF 即为 \(px+(1-p)px^2+(1-p)^2px^3+\dots=\frac{px}{px-x+1}\),因此 \(y_i\) 的 PGF 即为 \((\frac{px}{px-x+1})^i\)
此时我们可以考虑把 \(y_1\) 到 \(y_n\) 加起来得到生成函数,但是我们发现 \(y_i \ge i\),因此 \(i >n\) 的项加进来并没有影响
所以可以得到 \(\sum_{i=1}^\infty(\frac{px}{px-x+1})^i=\frac{1}{1-\frac{px}{px-x+1}}-1=\frac{px}{1-x}\),然后对系数求前缀和(即乘上 \(\frac{1}{1-x}\)),有 \(F(x)=\frac{px}{(1-x)^2}=p(x+2x^2+3x^3+\dots)\)
最后答案就是 \([x^r]F(x)-[x^{l-1}]F(x)=p(r-l+1)\),这也太妙了
Day 4+5 - 9.3+9.4
图论专项,练两天
1.CF547D Mike and Fish
非常自然。考虑每行每列红蓝最多差一,所以我们对于每一行,把这一行上的点两两配对,多一个不管,列同理,然后对于你练出来的这个图红蓝染色,发现这样的构造一定是合法的,你只需要证出这个图是二分图即可。考虑这样的练边方式必定是横竖边交替出现,不会出现奇环,所以必定是二分图
2.P15869【MX-X26-T5】「Cfz Round 7」anybody can finds love (expect you)
(做不出来是不是就无法 find love 了)(好像我真的做不出来QwQ)
首先这个类欧拉回路先把某个点度数为奇和某个点的相邻元素中有绝对众数(\(> \left \lfloor d_i/2\right \rfloor\))判掉。然后欧拉回路有种求法就是把边集划分为若干个边不重复的环再依次把这些环并起来,你考虑这道题也可以做一样的事情。若某个环上为 \(\dots\rightarrow a \rightarrow x\rightarrow b\rightarrow \dots\),另一个环上为 \(\dots\rightarrow c \rightarrow x\rightarrow d\rightarrow \dots\),显然这两个环一定可以合并为 \(\dots\rightarrow a \rightarrow x\rightarrow c\rightarrow \dots\) 或者 \(\dots\rightarrow a \rightarrow x\rightarrow d\rightarrow \dots\),因此任意两个环都可以合并。代码实现简单,我只写了一百万年
3.AT_agc018_f [AGC018F] Two Trees
欧拉路径好题,但是我不会,所以我选二分图
显然 \(X_u\) 与某棵树中 \(u\) 的子节点数奇偶性不同,这个先把无解判掉。然后你猜一下 \(X_i \in \{-1,0,1\}\),考虑这个东西怎么构造。你定义每个子树会给父亲传递一个关键点(子树中唯一一个没有被匹配的,需要填 $\pm1 $ 的点),然后你考虑这个关键点集合,如果 \(X_u \in \{-1,1\}\) 那把 \(u\) 也加进去。然后你发现这个集合大小一定是奇数,所以把集合内的点两两配对,把剩下一个当作关键点传上去。对于两棵树都这样做之后你把 \(X_i \in \{1,-1\}\) 的点提出来就会得到一个图,你发现一个点最多连两条边,所以图上的环的边一定交替来自两棵树,所以这就是二分图,然后很自然地二分图染色,分别赋值为 \(\pm 1\),那一个子树的权值和就是它的关键点的权值,一定是合法的
4.P3275 [SCOI2011] 糖果
显然是个差分约束(听说好像有贪心做法但是会被 hack),但是关于 SPFA,它死了,那你只能观察性质。你考虑这个差分约束连出来只会有边权为 \(0\) 和 \(1\) 的边,发现如果出现正权环这个差分约束就是无解的,这个东西缩完点之后在一个 SCC 里如果出现了一条边的边权为 \(1\),根据 SCC 的性质就一定会有正权环,所以 SCC 内部变量取值相同,然后就变成 DAG 上最长路,显然拓扑排序
5.P11095 [ROI 2021] 旅行 (Day 2)
这也太粪了
观察 Subtask,发现有两个 Subtask 本质上是确定了最小 / 最大值,这启示我们钦定当前最值,因为最小最大值并不好弄,所以感觉钦定最大值是更有前途的,将所有边排序枚举即可。
观察一下这个题在图上明显不好弄,考虑边双缩点把它弄到树上,发现边双有个很好的性质就是如果一条边在 \(1 \sim i\) 的路径上,那么边双缩点后它一定也在 \(1 \sim i\) 的路径上,所以你分讨一下加入边 \((u,v)\) 的影响:
- \(u,v\) 已经在一个边双里,没有任何影响
- \(u,v\) 不在同一个边双里,那显然要把 \(u \sim v\) 路径上的点全部缩成一个点双,然后子树修改。这个操作可以用并查集,钦定每个集合的根为深度最小的点即可,分析出来是均摊的
- \(u,v\) 不在一个联通块内,直接连起来
然后你发现第三种情况的所有边都是割边,这一定出现在 MST 上,所以先跑出 MST 过后可以预处理出每个点的点权,然后每个点与 \(1\) 所在联通块联通时重新算一遍即可。这个东西两棵线段树分别维护路径最小值和答案,区间 checkmin+单修单查是好做的
6.P4630 [APIO2018] 铁人两项
是道好题
Menger 定理推论:在一个点双中,任意三个不同顶点 \(a,b,c\),必定存在一条从 \(a\) 到 \(b\) 且经过 \(c\) 的简单路径
而相反地,如果三个点不在同一个点双中,就必须经过割点
显然根据这个你就考虑圆方树,把每个点双弄成一个点,就是一棵圆方点交替的树,显然你发现原图的每一条路径都与圆方树圆点之间的路径一一对应。然后你考虑怎么借助这个东西统计,发现如果圆方树上的一条路径经过了多个方点,那么中间的圆点就会被算重,所以把每个方点权值赋为对应点双的大小,圆点权值赋为 \(1\),统计所有圆点路径权值之和即可。但这直接做是 \(O(n^2)\),所以你考虑每个点对答案的贡献,算一下子树大小就行了。注意图不一定联通
7.P6378 [PA 2010] Riddle
看到点与点之间的限制关系显然想到 2-SAT,令 \(x\) 表示 \(x\) 要选,\(x'\) 表示 \(x\) 不选。分别考虑两个限制。每条边至少有一个端点是关键点显然就是 \(x' \rightarrow y\),\(y' \rightarrow x\)
然后你发现第一个限制要每个点往其所在部分中的其他所有点连边,这是 \(O(n^2)\) 的,所以我们需要用一些技巧。假设一个部分里的点为序列 \(p\),那你显然考虑到一个点的时候,如果它要选,那它前面的所有点都不能选,所以考虑辅助状态 \(pre_i\) 表示前 \(i\) 个点中的一个被选中,那么这个连边就是显然的 \(p_i \rightarrow pre_i\),\(pre_i'\rightarrow p_i'\),\(pre_{i-1} \rightarrow a_i'\),\(a_i \rightarrow pre_{i-1}'\),\(pre_{i-1} \rightarrow pre_i\),\(pre_i'\rightarrow pre_{i-1}'\) 前缀优化建图。输出方案的时候考虑在 \(i\) 和 \(i+n\) 中输出 SCC 标号小的那一个即可
(不是这卡空间真是恶心死我了,被迫打链式前向星,还要复用一大堆数组和 vector)
(不是空间限制怎么开到 500MB 了,这不好)(又开回 128MB 了,开心)(又开回 500MB 了,不嘻嘻TwT)
8.P5332 [JSOI2019] 精准预测
算是最简单的一道(结果评的黑题?)
显然考虑 \((x,t,0/1)\) 表示第 \(x\) 个人在 \(t\) 时刻死亡 / 存活的状态,则 \((x,t,0) \rightarrow (x,t+1,0)\),\((x,t+1,1)\rightarrow(x,t,i)\)。对于限制一有 \((x,t,0) \rightarrow (y,t+1,0)\),\((y,t+1,1) \rightarrow (x,t,1)\),限制二有 \((x,t,1)\rightarrow (y,t,0)\),\((y,t,1)\rightarrow(x,t,0)\)。显然这个图已经连成 DAG 了,我们不用再缩点,那么 \(x\) 的答案即为 \(n-1-必死的点数-\sum_{y=1,y\ne x且y不是必死点}^{n} [(x,T+1,1)可达(y,T+1,0)]\)。必死的点你只需要看拓扑的时候会不会由 \((x,T+1,1)\) 走到 \((x,T+1,0)\) 即可
这个东西的点数是 \(O(nT)\) 的,你考虑把没有出现在限制中的点全部优化掉,点数变成 \(O(n+m)\),这很好,那你就可以在这个 DAG 上跑可达性 \(\operatorname{dp}\) 加个 \(\operatorname{bitset}\) 优化。发现这样空间爆了,这不好,于是你发现可以分组做这个事情,即我每次只考虑一个长度为 \(B\) 的段对所有答案的贡献,空间复杂度 \(O(\frac{4(n+m)B}{\omega})\),取 \(B=1e4\) 即可,时间复杂度随便过
讲题?这也太难了
9.QOJ 10706 Red-Blue MST
考虑只有一个询问的时候就是 WQS 二分的板子。你思考一下这个过程,就是给每条红边边权减去 \(\lambda\) 然后跑 Kruskal,显然所有边可以划分成两类:
- 永远不在 / 永远都在 MST 中
- 存在某个 \(\lambda_0\),使得 \(\lambda < \lambda_0\) 时这条边不在 MST 中,\(\lambda>\lambda_0\) 时这条边在 MST 中
对于永远不在的,可以把红边蓝边单独拉出来跑一遍 Kruskal,不在生成树中的就永远不会在;对于永远都在的,可以先加入蓝边再加入红边,在生成树中的红边就永远都在,蓝边同理
第二类红边的 \(\lambda_0\) 一定是它的边权减去某条蓝边的边权,可以发现剩下的红蓝边是一个完美匹配,这个东西用分治匹配是好求的。然后你根据有解的一定是 \(k\) 的某个区间 \([k_l,k_r]\),考虑这个东西的凸性,你只要求个 \(k_l\) 对应的答案,然后排序前缀和即可。当然 WQS 二分套个整体二分显然也是可以的
10.P6643 [CCO 2020] Mountains and Valleys
这个东西的维护也太难了。你考虑这个东西走两条额外边一定是不优的(一条都不走的代价是 \(2(n-1)-l_{dia}\)),这样子我们只用枚举我们走的额外边 \((u,v,w)\)。考虑起点和终点为 \(s\) 和 \(t\),则若 \(s\rightarrow t\) 与 \(u\rightarrow v\) 的路径无交,减少的代价即为 \(dis(s,t)+dis(x,y)\),否则设交集长度为 \(l\),那么减少的代价就是 \(dis(s,t)+dis(x,y)-2(l-1)\),问题转化为找到 \(s\) 和 \(t\) 使 \(dis(s+t)-2(l-1)\) 最小。
考虑把直径扯出来,把 \(u\) 和 \(v\) 投影到直径上,那么无交的情况全部可以处理成区间最值问题,这时好维护的。设 \(u\) 和 \(v\) 在直径上的投影为 \(x\) 和 \(y\),如果和 \(u\rightarrow x\) 或者 \(v\rightarrow y\) 有交,可以用换根 \(\operatorname{dp}\) 维护,如果与 \(x\rightarrow y\) 有交,那么交集一定是一段连续区间,线段树可以维护,再维护一个前后缀 \(\max\),转移就容(gou)易(shi) 了,这样是 \(O(n+m\log n)\)。听说还有 \(O(n+m)\) 的,但是我是区
Day 6+7 - 9.5+9.6晚+9.7
还有杂题环节,我来品鉴(?怎么是集训队互测,好怕)
QOJ 7980 区间切割
你考虑题目中这个切割有什么性质,你发现如果我能快速计算一部分切割,再特殊位置处理一下使得区间长度快速缩短,这个复杂度就是可以的。手玩一下发现你把区间分成左中右三段的话,在左右的切割你都可以直接弄,这个你只需要记录左段最靠右的切割和右段最靠左的切割即可,然后你发现每次在中间的切割都至少会把原区间长度减少 \(\frac{1}{3}\),所以这种操作的最多是 \(O(\log \operatorname{len})\) 的,每次这种操作就更新左右端点即可,然后这些操作再扫描线一下即可,这样是 \(O(n \log^2 n)\) 的
剩下这两道题也太难了,根本不会做
图论杂题继续讲课
1.P10357 [PA 2024] Żelki
考虑相当于每种颜色买一个,然后以这种方式买多次,所以背包预处理一下,然后同余最短路即可(这个还是挺难的吧)
2.CF1801D The way home
这个题不是很自然。令 \(dp_{i,j}\) 表示当前走到点 \(i\),在 \(i\) 之前经过的节点中 \(w_j\) 最大,此时的最小表演数和最大剩余钱数。转移时优先考虑表演数小的,再考虑剩余钱数大的。这个东西放到最短路上一起做即可。
证明的话你考虑两个节点 \(\{a_1,b_1\}\) 和 \(\{a_2,b_2\}\) 都能转移到 \(dp_{i,j}\),其中 \(a_1<a_2,b_1<b_2\),那你考虑两者都经过点 \(j\),根据策略有 \(b_2<w_j\),那你考虑给第一个节点在点 \(j\) 处增加 \(a_2-a_1\) 次表演,这样第一个节点一定更优
3.AT_agc034_d [AGC034D] Manhattan Max Matching
你观察一下发现这个二分图好像啥东西都用不了,那你求这个最大值只能考虑费用流,显然建出超级源点汇点之后跑最大费用最大流是简单的,但是这个 \(O(n^2)\) 的边数啥都跑不了,考虑优化
你发现这个 Manhattan 距离有个很好的性质就是这个东西的最大值可以拆绝对值弄成四个式子的最大值(但是这个东西对最小值并不适用),所以你考虑建四个虚点,每个红点向虚点分别连 \(x+y\),\(x-y\),\(y-x\),\(-x-y\),虚点向每个蓝点分别连 \(-x-y\),\(y-x\),\(x-y\),\(x+y\),然后边数就是 \(O(n)\) 的了,用 Primal-Dual \(O(nm+m\log mf)\) 能跑
4.AT_agc056_c [AGC056C] 01 Balanced
设 \(sum_i\) 表示 \(1\sim i\) 中 \(0\) 的个数减 \(1\) 的个数,则有 \(\forall 1\le i <n,|sum_{i+1}-sum_i| \le 1\),并且对所有限制有 \(sum_{l_i-1}=sum_{r_i}\),而字典序最小即为 \(sum\) 的字典序最大,显然差分约束是好做的。观察边权发现这个可以用 01 bfs 做
5.AT_arc076_d [ARC076F] Exhausted?
你考虑 Hall 定理的推论:二分图最大匹配等于 \(|V_L|-\max_{S\subseteq V_L} (|S|-|\bigcup_{v\in S}N(v)|)\),其中 \(V_L\) 表示左部点集合,\(N(v)\) 表示与 \(v\) 相邻的点构成的点集
这道题显然可以转化为二分图求最大匹配,根据上述推论,答案即为 \(n-(|V_L|-\max_{S\subseteq V_L} (|S|-|\bigcup_{v\in S}N(v)|))=\max_{S\subseteq V_L} (|S|-|\bigcup_{v\in S}N(v)|)\),然后你发现两段区间的并集并不好做,所以你弄一下变成 \(\max_{S\subseteq V_L}(|S|+|\bigcap_{v\in S}[l_v,r_v]|)-m\),就转化为了给定 \(n\) 个区间,求从中选择任意个,区间数量加区间交集长度之和的最大值,这个东西你按左端点排序后线段树维护一下 \(r+\sum [l_j \le l][r \le r_j]\) 即可
6.P7816 「Stoi2029」以父之名
欧拉这双眼睛到底看了多远
你发现这个给每条边定向的东西看着就很像这个欧拉回路,但他没保证这个东西每个点的度数都是偶的,然后你再观察一下发现每个点有奇数条 \(1\) 边,然后你再发现这个东西相当于要有一次 \(2\) 边进 \(1\) 边出或者直接 \(1\) 边出,所以你很自然地对每个度数为奇的点连向一个虚点,边权为 \(1\),然后根据限制在跑欧拉回路的时候,优先走边权等于入边边权的出边。这样的话显然不会出现 \(2\) 边进虚边出的情况,那这个构造就是合理的(会有点卡常,所以要加当前弧)(突然发现这个欧拉路径要把所有联通块跑完,我说怎么被 Hack 了)
(手玩出来之后我对着这个东西分(che)析(dan)了半天,我说这构造出来把虚边去掉之后是不是会不联通,想(che)了一百万年才发现没要求联通)
7.P13592 [NWRRC 2023] Loops
好像可以把这个东西放到实数域上暴力跑然后用平衡树弄一下,但是我不会,所以我选择拓扑
你钦定每种类型的矩形最大值均在左上角,然后你画一下发现你可以把每种类型的矩形弄到有三条边一样,只有最右侧那条边在 \(2\) 类矩形中会从下到上,而在 \(1\) 和 \(3\) 类矩形中你发现你只关心第 \(2\) 大和第 \(3\) 大的大小关系,所以你考虑固定每个点向它的右侧点连边,第一列的点向它下面的点连边,然后你对于每一列你根据当前 \(2\) 类矩形的个数来看当前矩形是否被翻转,然后对于 \(1\) 和 \(3\) 类矩形连一下第 \(2\) 大到第 \(3\) 大即可。这个是 \(O(n^2)\) 的
8.P13358 [GDCPC 2024] 小班课
全场最粪我不多讲
9.CF2061G Kevin and Teams
严肃学习 Cockayne–Lorimer 定理
对于给定正整数 \(n_{1,2,\dots,t}\),记 \(n_iK_2\) 为大小为 \(n_i\) 的匹配,则多色拉姆齐数 \(R(n_1K_2,n_2K_2,\dots,n_tK_2)=\max\{n_1,n_2,\dots,n_t\}+\sum_{i=1}^t(n_i-1)+1\),含义即最小正整数 \(n\),使得无论怎么染色都存在一个 \(i\),使得所有该颜色的边形成一个大小 \(n_i\) 的匹配。这道题目即求 \(R(kK_2,kK_2) \le n\) 最大的 \(k\),套进公式发现 \(k \le \left \lfloor \frac{n+1}{3} \right \rfloor\),你发现可以将 \(\frac{2}{3}\) 的点两两连边剩下的全部不管,这可以取到上界,构造可以用增量法维护一条同色链(fen)。这个上界具体的证明没太搞懂,大概就是假设可以取更大然后做匹配发现变成 gunmu 就不行然后这个上界就对了
10.CF1361E James and the Chase
先把这个 \(20\%\) 扔掉。你考虑如何快速判断一个点 \(u\) 是不是好点,这个限制条件即以 \(u\) 为根建出 \(\operatorname{dfs}\) 树,没有前向边或者横叉边,\(O(n)\) 可以判断。你再考虑如果现在有一个好点 \(u\),如何快速求出其他好点,你依旧考虑以 \(u\) 为根建出 \(\operatorname{dfs}\) 树,发现 \(v\) 的子树内一定有至少一条返祖边,显然如果 \(v\) 是好点返祖边有且仅有一条,否则 \(v\) 到 \(fa_v\) 就有两条路径。那你记录每个 \(v\) 子树中返祖边指向的点 \(p\),猜测 \(v\) 和 \(p\) 同时为好点 / 非好点,证明考虑充分必要分开讨论路径即可。所以你只需要对于每条返祖边树上差分判断即可。
然后你把这个 \(20\%\) 拿回来,发现这个直接判断并不好弄,那你既然是个概率就弄个随机化上去,随机个 \(100\) 次排除宇宙射线的影响,如果一直没有好点直接输出 \(-1\),否则就找出来就行了
11.P11812 [PA 2015] 精确打击 / Kontrmanifestacja
一个很显然的东西是你考虑抓出任意一个环删掉它,如果删了之后仍然有环,答案显然是 \(0\)。否则就是个 DAG,你考虑把环上的点按顺序重标号为 \(1\sim k\),分讨在这个 DAG 上的可达性。你记录 \(Mx_i,Mn_i\) 分别表示 DAG 上点 \(i\) 可达的编号最大和最小的点。如果 \(i<Mx_i\) 则区间 \((i,Mx_i)\) 不合法。如果 \(Mn_i \le i\) 则记录最大的 \(i\) 可达且 \(\le i\) 的点 \(Mx'_i\),则区间 \([1,Mx'_i) \bigcup (i,k]\) 不合法。显然右边是可以直接盖掉的,左边的话可以在反图上跑一下所有可以到达编号大于它的点,然后直接盖掉即可。这个东西用差分就可以了
12.AT_agc036_d [AGC036D] Negative Cycle
这种看着比较能挖性质的题就非常需要手玩。观察这个图的结构+手玩你发现一定更不会出现某条 \(-1\) 边被删掉但其内部的 \(-1\) 边没被删掉,换句话说若某条 \(-1\) 边 \(i\rightarrow j\) 没被删掉,那么 \(\forall l\le i,r \ge j,l\rightarrow r\) 的边也不会被删掉,因为这种边可以由 \(i\rightarrow j\) 的边前后走若干条 \(0\) 边来等效替代。玩出这个之后你发现最优解的 \(-1\) 边一定形如一种区间划分方式,使得一个区间内没有边,且保留一个区间内的点向其后面区间内的点连的边,再玩一玩发现每个点属于且仅属于一个区间,因为若一个点不属于某个区间一定可以让它加入左右的区间使答案更优。这样构造 \(-1\) 边之后你发现可以保留的 \(1\) 边只有同一个区间或者相邻区间内连的边。
玩的这里这个 \(\operatorname{dp}\) 就很显然了。\(dp_{l,r}\) 表示当前最后一个区间是 \([l,r]\) 时的答案,转移是简单的 \(O(n^3)\)
听说要学数论树论了,这并不好
Day 8+9 - 9.8+9.9
开始学数论树论,严肃在 9.9 上午听了 ningago 讲课
1.CF1844G Tree Weights
有史以来做过最人类智慧的题,真是神了
你考虑 \(x_i=dis(1,i)\),所以 \(x_1=0\),那你考虑你怎么递推这个东西。列出式子移完项即 \(x_{i+1}=d_i-x_i+2\times x_{\operatorname{LCA}_{i,i+1}}\),你发现最后一个二倍项很烦。【前方高能】那你动用惊人的注意力和极致的手玩你发现把这个式子模 \(2\) 它就变成了 \(x_{i+1}\equiv d_i-x_i \pmod 2\),然后你递推就能求出所有 \(x_i\) 的最后一位。这个时候你再观察上面那个式子你发现实际上就是由 \(x_{\operatorname{LCA}_{i,i+1}}\) 的第 \(k\) 位推出 \(x_{i+1}\) 的第 \(k+1\) 位,所以你再一位一位递推即可,预处理 \(\operatorname{LCA}\) 即可 \(O(n\log V)\)
2.【模板】虚树 / [SDOI2011] 消耗战
朴素 \(\operatorname{dp}\) 显然是简单的,但这是 \(O(nq)\) 的,很不好。我们不难发现一次询问中很多点都是没用的,数据范围中关键点总数与 \(n\) 同阶,这说明在一次询问中关键点实际上很稀疏,这启示我们让复杂度与关键点点数相关,于是引入虚树(对于一棵树,仅保留有用的点,重新构建一棵树)。你发现虚树中祖孙关系是不会改变的,同时我们甚至可以在虚树中随意添加节点,所以为了方便,我们默认加入点 \(1\),于是我们只需要考虑怎么构建虚树即可,显然把关键点排序之后相邻两个求 \(\operatorname{LCA}\) 后将整个序列排序去重,最后对这个序列相邻两个点 \(x,y\),连边 \(\operatorname{LCA}(x,y),y\) 即可。显然虚树点数是关键点点数的两倍,所以你直接在虚树上跑朴素 \(\operatorname{dp}\) 就能做到 \(1\log\) 了
3.CF1458F Range Diameter Sum
持续学习学习
你考虑这个直径不好搞,正常两遍 \(\operatorname{dfs}\) 求直径肯定是炸了。那你只能考虑把直径从中间拆开,这个东西就是树上圆理论。先把每条边倍长并建虚点,然后你发现对于点集 \(S\),所有直径的中点一定重合,否则会有更长的直径,矛盾,因此你就可以定义 \(C(S)=(v,r)\) 即到 \(v\) 距离不超过 \(r\) 的点集,其中 \(v\) 是直径中点,\(r\) 是直径一半。这个东西有两个结论:
(1)如果 \(S \subseteq (v,r)\) 且 \(a,b\in S\),则 \(dis(mid(a,b),v)+\frac{dis(a,b)}{2} \le r\),其中 \(mid(a,b)\) 表示 \(a,b\) 路径的中点。画图发现这是显然的
(2)如果 \(S\subseteq (v,r)\),则 \(C(S) \subseteq (v,r)\)。套一下(1)发现这也是显然的
有了这个之后你考虑合并两个树上圆 \(C_1,C_2\);如果某个圆包含在另一个圆内显然直接合并为大圆,否则可以类似几何圆的合并,合并为 \((v,r=\frac{r_1+r_2+dis(v_1,v_2)}{2})\),其中 \(v\) 表示 \(v_1\) 向 \(v_2\) 方向移动 \(r-r_1\) 最终的位置
回到这道题,这个两层包含显然考虑分治,考虑计算 \([l,r]\) 中跨过 \(\operatorname{mid}\) 的线段,设 \(L_i,R_i\) 分别表示 \([i,mid]\) 和 \([mid+1,i]\) 的圆全部合并起来的结果,这两个东西是好处理的,考虑从右往左对于每个 \(L\) 计算,发现 \(R\) 一定分成三段,分别对应左包含右,几何圆合并,右包含左,并且这两个划分点都在不断右移,于是问题转化为维护点到点集距离之和,点分树一拍就写完了,这是 \(2\log\) 的,树剖是 \(3\log\) 的,但是代码都不(shi)好(yi)打(tuo)
而经过我深奥的思考(我到底会在什么地方用到这种神奇东西???),我严肃决定尝试玩出另一种做法
设树为 \(T\),两点距离为 \(\operatorname{dis}(u,v)\),对于任意非空点集 \(S\subseteq V\),记 \(\operatorname{diam}(S)=max_{u,v\in S}\operatorname{dis}(u,v)\)
引理 1:若点集 \(S\) 直径为 \((a,b)\) 且 \(x \notin S\),则点集 \(S \cup\{x\}\)的直径为 \((a,b),(x,a),(x,b)\) 中 \(\operatorname{dis}\) 最大的一个;证明即证 \(\forall y\in S,\operatorname{dis(x,y)} \le \max(\operatorname{dis}(x,a),\operatorname{dis}(x,b))\),考虑把 \(x\) 投影到直径 \((a,b)\) 上即可
引理 2:固定点 \(x\),对于任意非空点集 \(S\),定义 \(F(S)=\operatorname{diam}(S)-\max_{y\in S}\operatorname{dis}(x,y)\),则若 \(A\subseteq B\),有 \(F(A)\le F(B)\),即 \(F\) 关于集合包含关系单调不降;证明考虑树上四点点性质
引理 3:固定左端点 \(x=l\),考虑区间族 \(S_r=\{l+1,l+2,\dots,r\}(l<r)\),若存在某个 \(r_0\) 使得 \(\operatorname{diam}([l,r_0])=\operatorname{diam}([l+1,r_0])\),则对所有 \(r \le r_0\),均有 \(\operatorname{diam}([l,r])=\operatorname{diam}([l+1,r])\),这等价于右端点在 \([l+1,n]\) 中,直径发生变化的位置构成一个前缀;证明考虑将区间当作点集套用引理 2
有了这三个东西你考虑从大到小扫左端点 \(l\),假设当前我们要将 \(x=l\) 加入点集。我们将右端点 \(r\) 按照直径划分成若干连续段,每个连续段中的直径相同,这个东西可以用栈存。然后从栈顶(最左侧)开始,逐个检查所有段,如果不变就不用扫了因为后面的都不会变,变了的就和前面的区间合并。最终答案相当于所有左端点答案之和。
分析一下复杂度,这个东西主要在于栈中的合并次数。感性理解一下,考虑合并一次相当于删除一个区间,整个流程中只会创建 \(O(n)\) 个区间,所以这个 \(O(n)\) 的。这个代码就非常的善(gou)良(shi)了对(ni)吧(ma)
5.CF741D Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths
这个重排构成回文很明显可以拆成路径异或,要求异或和至多一位为 \(1\)。一眼想到点分治,结果是有根树就掉坑里了。你观察一下发现这个东西状压之后,可以在子树里把路径问题弄成子树问题,然后 dsu on tree 就可以做了
Day 8 - 9.8晚 定时练习(二)
A.CF2244G Yura and Deadlines
显然的 \(\operatorname{dp}\),看到绝对值和 \(\max\) 经典拆掉,弄成两个条件 \(j\le i-a_i-1\) 和 \(j+a_j+1 \le i\),你考虑到 \(i\) 的时候把所有 \(j+a_j+1=i\) 的 \(j\) 加入可转移集合,第一个条件用树状数组即可
B.CF2238E Cake Trial
考虑没有 N 时,区间 \([l,r]\) 会错 \(F_n-(2F_r-r)+(2F_{l-1}-(l-1))\) 个,其中 \(F_i\) 表示前缀 \(1 \sim i\) 中 F 的个数,然后你观察数据范围发现这个 \(O(n^3)\) 的提示给的太明显了,所以你考虑把这个前缀 \(2F_i-i\) 最大值也记录下来。设 \(dp_{i,j,k}\) 表示前 \(i\) 个位置,有 \(j\) 个 F,其中 \(\max_{1\le l\le i} 2F_l-l=k\) 时,所有区间错误数最小值的最大值,直接转移就是 \(O(n^3)\) 的,好像还有 \(O(n^2)\) 的反贪做法,大概就是枚举最大子段和然后 \(O(n)\) 扫一遍构造即可
C.CF2253E Diameter Intersections
直径有个显然的结论就是所有直径交于一点,然后你再发现这个题给了个 \(n\) 为奇数,所以这个结论更强了,变成了所有直径交于一边,那你相当于把这一条边 \((u,v)\) 删了然后 \(u,v\) 子树内取等长。手玩+证明发现这个可能深度数是 \(O(\sqrt n)\) 的,所以你直接枚举所有情况就是 \(O(n)\) 的了。证明这个结论考虑构造虚树然后发现若深度为 \(m\) 则点数至少为 \(\frac{m(m+1)}{2}\),所以深度是 \(O(n)\) 的
D.CF2195G Idiot First Search and Queries
很显然你把这个从 \(1\) 开始的遍历顺序写下来就是欧拉序,那这个数据范围很明显是倍增,所以设 \(fa_{u,i}\) 表示 \(u\) 的 \(2^i\) 级祖先,\(w_{u,i}\) 表示 \(u\) 走到其 \(2^i\) 级祖先需要的步数,转移显然 \(w_{u,i}=w_{u,i-1}+w_{fa_{u,i-1},i-1},w_{u,0}=2 \times \operatorname{Size}_u-1\),然后你显然可以倍增地跳祖先,跳到某个祖先发现走不动了那么就在那个祖先的子树内,这个显然用欧拉序是好求的
E.QOJ 6543 Visiting Friend
这相当于说你要判断 \(A,B\) 是不是割点。显然花 \(0\) 秒看出圆方树。你相当于要在圆方树上把 \(A\) 所有不含 \(B\) 的子树全部删掉,\(B\) 同理,剩下这棵树的大小就是答案,这个东西可以树剖或者 \(\operatorname{LCA}\) 做到带 \(\log\),但这还是太不优秀了
你考虑把询问离线下来,同时放到 \(A\) 和 \(B\) 上,那你考虑这两者要么是祖孙关系要么没有关系,所以你遍历到一个点 \(x\) 的时候,显然可以用一个 \(\operatorname{vis}\) 来存当前节点的祖先,把 \(x\) 的所有询问拿出来,如果询问的点 \(u\) 是 \(x\) 的祖先这个询问的答案即为 \(\operatorname{Size}_{\operatorname{Son}_u}-\operatorname{Size}_x+1\),其中 \(\operatorname{Son}_u\) 表示 \(u\) 子树内 \(x\) 方向上的子节点,这个东西显然你在 \(\operatorname{dfs}\) 的时候每个点要遍历子节点的时候改一下就行了。这个过程做完以后没有值的询问显然就是 \(A,B\) 无关的询问,答案显然为 \(n-\operatorname{Size}_A-\operatorname{Size}_B+2\),这样我们就做到了 \(O(n)\)
F.CF2252F Spectral Components
对于颜色 \(c\),设断开一条边后两个联通块中 \(c\) 的出现次数分别为 \(x,cnt_c-x\),显然一条边若不在联通块内贡献为 \(w_e=\min(x,cnt_c-x)\),那么答案下界即为 \(\sum w_e\) 减去 \(w\) 的前 \(k_c-1\) 大,这个东西你发现从从根向下的路径上 \(w\) 单调递减,所以你排个序直接选择前 \(k_c-1\) 条边得到的显然是联通块,所以答案下界可以取到,所以你考虑建出虚树之后记录所有 \((w,dep_v-dep_u)\) 的二元组即可求出前 \(k_c-1\) 大,显然 \(O(n \log n)\)
Day 9 - 9.9下午 定时练习(三)
我靠真是被我自己唐飞了
A.CF2184E Exquisite Array
弄出相邻元素差的绝对值数组 \(d\),单调栈求一下每个值左右第一个不超过它的,然后特判一下右边和他相等的情况,即你统计的是每个点作为子区间前缀最小值出现,这个东西就是 \(O(n)\) 的
B.CF2247D2 XOR Sorting (Hard Version)
你发现你两个数是可以一直改变一位二进制位来做到交换的,这启示我们每一块的块长仅与 \(k\) 的最高位有关,所以 \(k=2^x(x\in \mathbb{N})\),那么块长即为 \(2^{k+1}\),所以转化为最小块长使得不存在跨块逆序对,由于块长为 \(2\) 的幂次,容易想到线段树解决,维护 \(\min,\max,ans\),在合并的时候判断这一层有无逆序对即可,显然把 \(n\) 补齐到 \(2^{\left\lceil\log_2n \right\rceil}\) 更为好做,查询的时候直接查询根节点即可(线段树叶节点个数为 \(2\) 的幂次的时候只用开 \(2\) 倍空间即可)
C.CF2137G Cry Me a River
这种博弈论真是考到痛点了,完全弄不懂TwT
以下默认 \((u,v)\) 为指定图上的一条有向边。设 \(dp_{i,0/1}\) 表示棋子在点 \(i\),该先手 / 后手行动,先手是否必胜,有 \(f_{u,0}=\operatorname{or}_v f_{v,1},f_{u,1}=\operatorname{ans}_v f_{v,0}\),然后你发现只会把蓝点染成红点,所以 \(f\) 不会由 \(0\) 变为 \(1\)。考虑 \(d_u\) 表示满足 \(f_{v,1}=1\) 的点 \(v\) 的个数,你考虑维护一个队列,里面存的是 \(f_{u,1}\) 变为 \(0\) 的 \(u\)。对于点 \(u\),在反图上将所有 \(v\) 的 \(d_v\) 减 \(1\),如果 \(d_v\) 变为 \(0\) 就把 \(v\) 入队并把 \(v\) 的出点 \(w\) 的 \(f_{w,1}\) 改为 \(0\),重复这样的操作。考虑每个点最多入队一次,每条边最多更新一次,所以复杂度是线性的
D.CF2236F2 Elections in Saransk (hard version)
老牧师题目又骗我,我就说怎么才开 \(5\times 10^5\),考场上没有观察出来复杂度掉成 \(O(n^2)\)
看到 \(\operatorname{lcm}\) 显然把每个质数 \(p\) 单独考虑答案再相乘即可,则实际上条件等价于 \(v_p(x)+\max e_i=\sum e_i\),其中 \(0\le e_i \le v_p(a_i)\)。那你考虑 \(v_p(x)>0\) 的 \(p\) 最多只有 \(7\) 个,对于 \(v_p(x)=0\) 的 \(p\) 显然至多有一个 \(e_i>0\),方案数为 \(1+\sum v_p(a_i)\),\(v_p(x)>0\) 的素数直接 \(\operatorname{dp}\) 即可,复杂度是 \(O(n\log^3 V)\)
E.CF2181J Jinx or Jackpot
有点强,我来学学
首先显然我们是先投 \(0\) 元来验概率,开始投钱时就直接全部投
记 \(\mathbb{P}(A)\) 表示事件 \(A\) 发生的概率,\(\mathbb{P}(A|B)\) 表示在 \(B\) 事件发生的前提下 \(A\) 事件发生的概率,\(\mathbb{P}(A \cap B)\) 表示 \(A,B\) 事件同时发生的概率,有 \(|\) 的优先级低于 \(\cap\)
那么我们有 \(\mathbb{P}(A|B)=\frac{\mathbb{P}(A\cap B)}{\mathbb{P(B)}}\) ,贝叶斯公式 \(\mathbb{P}(A|B)=\frac{\mathbb{P}(B|A)\cdot \mathbb{P}(A)}{\mathbb{P}(B)}\) 和全概率公式 \(\mathbb{P}(B)=\sum \mathbb{P}(B|A_i)\cdot \mathbb{P}(A_i)\),根据这两个你发现贝叶斯公式还有推广形式:设样本空间 \(\Omega\) 被一组完备事件 \(A_{1,2,\dots,n}\) 划分(两两互斥且并集为全集)且 \(\mathbb{P}(A_i)>0\),那么对于任意一个事件 \(A_k\),有 \(\mathbb{P}(A_k|B)=\frac{\mathbb{P}(B|A_k)\cdot \mathbb{P}(A_k)}{\sum \mathbb{P}(B|A_i)\cdot \mathbb{P}(A_i)}\)
你发现你下一发赢的概率与输赢的局数和 \(p_{1,2,\dots,n}\) 有关,考虑从这里入手。设当前赢了 \(x\) 局,输了 \(y\) 局,当前状态下下一发赢的概率为 \(a_{x,y}\),事件 \(A\) 为下一发赢了,事件 \(B\) 为达到当前 \((x,y)\) 的局面,事件 \(C_i\) 为老板选了第 \(i\) 个,\(q_i=\frac{p_i}{100}\),显然 \(a_{x,y}=\mathbb{P}(A|B),\mathbb{P}(C_i)=\frac{1}{n}\),根据全概率公式有 \(\mathbb{P}(A|B)=\sum\mathbb{P}(A|C_i\cap B)\cdot \mathbb{P}(C_i|B)=\sum q_i\cdot \mathbb{P}(C_i|B)\),你考虑怎么计算 \(\mathbb{P}(C_i|B)\),根据贝叶斯公式有 \(\mathbb{P}(C_i|B)=\frac{\mathbb{P}(B|C_i)\cdot \mathbb{P}(C_i)}{\mathbb{P}(B)}\)
拆开发现 \(\mathbb{P}(B|C_i)=\dbinom{x+y}{x}q_i^x(1-q_i)^y,\mathbb{P}(C_i)=\frac{1}{n},\mathbb{P}(B)=\sum \mathbb{P}(B|C_j)\cdot \mathbb{P}(C_j)=\frac{1}{n}\sum \dbinom{x+y}{x}q_j^x(1-q_j)^y\),代入得到 \(\mathbb{P}(C_i|B)=\frac{q_i^x(1-q_i)^y}{\sum q_j^x(1-q_j)^y}\),再代回最开始的式子有 \(a_{x,y}=\mathbb{P}(A|B)=\frac{\sum q_i^{x+1}(1-q_i)^y}{\sum q_i^x(1-q_i)^y}\),然后你发现 \(p_i\) 值域很小,所以你压缩一下就可以做到 \(O(k^2V)\) 求出 \(a_{x,y}\),然后设 \(dp_{x,y}\) 表示赢了 \(x\) 局,输了 \(y\) 局状态下,期望最终赢的钱数是现在的多少倍,显然当 \(x+y=k\) 时 \(dp_{x,y}=1\),否则我们要么投 \(0\) 元试概率,要么全投完,所以 \(dp_{x,y}=\max(2a_{x,y}\cdot dp_{x+1,y},a_{x,y}\cdot dp_{x+1,y}+(1-a_{x,y})\cdot dp_{x,y+1})\),答案即为 \(1000(dp_{0,0}-1)\),复杂度瓶颈在于预处理的 \(O(k^2V)\)。然后还有就是你发现 \(p\) 全为 \(0\) 或 \(100\) 时一定有一种不会出现,判掉就行了
F.CF2172H Shuffling Cards with Problem Solver 68!
考场第二道开的这道题结果是最难的,玩了一个小时玩出了 114514 个性质发现还是做不出来。
手玩发现一个序列洗牌 \(k\) 次变回原序列,所以先将 \(t\) 对 \(k\) 取模。再手玩一会儿发现你可以把这个序列拆成 \(2^{k-t}\) 个块,每个块长度为 \(2^t\),然后你再玩一玩发现你每次把最上面一张牌放到最底下实际上是把最上面一个块扔到最后并且把这个块的第一个放到最后一个,考虑快速维护这个东西(我都推到这儿了还没做出来)。
这个东西你考虑维护每个块的哈希值,然后块内的变化显然你是好维护的,块位置的变化存一下即可,然后比较字典序的时候二分出第一个不一样的块,再二分第一个不一样的位置即可,算一下发现时间复杂度是 \(O(k2^k)\) 的(诶我考场上怎么没想到哈希,哦哦好像是我以为哈希不能维护字典序,事实上哈希虽然不能维护大小关系,但可以维护不等关系,然后你到具体位置判一下即可)
Day 10 - 9.10
又讲课,这也太牛了
哦不不不我怎么一道题都不会做,我还是去补一补前面的坑吧
4.P7563 [JOISC 2021] 最悪の記者 4 (Worst Reporter 4) (Day4)
还有线段树合并的事
你发现这个玩意儿可以看作 \(n\) 条边并且每条边有偏序关系,所以你考虑 \(i\) 向 \(a_i\) 连边构成基环树,显然考虑树形 \(\operatorname{dp}\),你发现这不好弄所以你先考虑树的情况。
设 \(dp_{u,i}\) 表示 \(u\) 为根的子树内,\(u\) 的值为 \(i\) 的最小代价,显然把 \(H\) 离散化,设范围为 \([1,m]\),有 \(dp_{u,i}=c_u\times [H_u\ne i]+\sum_v \min_{i \le j \le m}\{dp_{v,j}\}\)。直接做是 \(O(n^2)\) 的,并不好。你显然先把答案加上 \(\sum c_i\) 弄成 \(dp_{u,i}=\sum_v \min_{i \le j \le m}\{dp_{v,j}\}-c_u\times [H_u=i]\),然后你观察这个式子的结构,你发现这个东西是可以放到线段树上然后做线段树合并的,所以你维护一下最小值和懒标记即可,实质上就是维护一个后缀,所以合并时先合并右子树再合并左子树,然后最后那个单点减先查询出来覆盖即可,这样是 \(O(n\log n)\)。你考虑基环树的环上显然 \(H\) 相同,枚举一下这个值即可
(不是 OpenAI 怎么开发出了 GPT-6 然后爆标掉一堆题,什么 NP 问题全部 poly 碾过去,好阴间,人类要完蛋了,人类文明凶多吉少了)
(瘫坐在椅子上,宛如看到原子弹爆炸 \(\rightarrow\) 核弹瘫坐,椅子爆炸 \(\rightarrow\) 人蛋核瘫椅炸)
莫名有点猎奇,猎奇完了发现又没什么,反正以后都会被 AI 踹死还不如不管它自己学
(哦不不不听说明天模拟赛我无疑是愤怒的👿👿👿)
Day 11 - 9.11
NOIP模拟赛 Round 3
干 T2 干了三个半小时最后剩 1 分钟打暴力的来了,最后 T2 还没弄出来,说自己策略不对都是借口,根本原因就是自己太区,算是长个教训(蓝紫黑黑喜欢吗)
1.旋转 rotate
反悔贪心板子,你显然考虑把这个东西弄在差分数组上,然后优先队列匹配一下下降和上升即可
2.真皮 pi(CF819D Mister B and Astronomers)
定义 \(pre_i=\sum_{j=2}^i a_j,S=\sum a_i,g=\gcd(S,T)\),那么第 \(i\) 位天文学家会在 \((pre_i+kS)\bmod T,k\in \mathbb{N}\) 时观测,你考虑每一位天文学家会第一次走到哪些位置。显然你可以把这种循环问题放到图上,从 \(x\) 向 \((x+S)\bmod T\) 连边,很经典地,这个图由 \(g\) 个大小为 \(\frac{T}{g}\) 的环组成并且每个环上的点 \(\bmod g\) 同余,你只需要考虑多个天文学家在同一个环上的答案,显然每个天文学家的答案是他在环上走到下一个天文学家的距离,那么很显然的你可以给每个环选一个起始点 \(t\in [0,g)\),求出每个点在环上的编号即可,余数 \(x\) 在环上的编号用 \(\operatorname{exgcd}\) 求解方程 \((x \bmod g)+kS\equiv x\pmod T\) 就做完了。最后判一下环上只有一个人的情况
3.好序列计数 count(CF2154F2 Bombing (Hard Version))
严格大于 T4 吧,完全不可能会做这种题
玩一下你就发现 \(p_i<i\) 为红色,\(p_i>i\) 为蓝色,所以说最终的序列一定满足 \(p_i=i\) 的部分为一个前缀+一个后缀,那你先把全部 \(p_i=i\) 或者 \(p_i=-1\) 的给判掉,只考虑存在 \(p_i\ne i\) 的情况,显然先把前后 \(p_i=i\) 删了
把限制玩一下, \(p_i<i\) 则 \(1\sim i\) 有 \(p_i\) 个红色,\(p_i>i\) 则 \(1\sim i\) 有 \(p_i-k\) 个蓝色,按 \(i\) 排序后你考虑相邻两个限制 \(i,j\),若同色则方案为 \(\binom{j-i-1}{a_j-a_i-1}\),这个与 \(k\) 无关可以预处理,若不同色你推一下就发现两种方案均为 \(\binom{j-i-1}{a_j+a_i-i-k-1}\),你考虑这个东西有意义的时候有 \(0\le a_j+a_i-i-k-1 \le j-i-1\),解得 \(k\in[a_i+a_j-j,a_i+a_j-i-1]\),所以你发现对于每个 \(i,j\) 枚举 \(k\) 的总复杂度是 \(O(n)\) 的,然后就过了,这也太强了
4.神秘题 mystical(CF418E Tricky Password)
名副其实(考场上居然没有打表,我是祝)
打表观察你发现所有偶数行相同,所有除 \(1\) 以外的奇数行也相同。考虑证明这个结论,第 \(2\) 行是前缀出现次数,设第 \(i\) 位为 \(x\),那么第二行一定有 \(1\sim x-1\) 各一个,设第 \(3\) 行第 \(i\) 位为 \(y\),则第 \(2\) 行第 \(i\) 位及以前有 \(y\) 个 \(x\),对应的就会有 \(y\) 个 \(1\sim x-1\),所以你对应到第 \(3\) 行就是 \(x\) 个 \(y\),所以第 \(4\) 行第 \(i\) 位为 \(x\),因此第 \(2\) 行与第 \(4\) 行相同,同理第 \(3\) 行与第 \(5\) 行相同,以此类推,证毕。因此实际上只有前三行有用(好神秘的结论)
然后我们要做的就是维护动态前缀桶和前缀桶的桶,思考一下发现单 \(\log\) 做法不太现实(可能我是区),然后你考虑你每次查询相当于左端点固定为 \(1\),而你还有修改,考虑带修莫队,然后你发现这个左端点没必要放进来,所以你把时间和右端点弄在一起就是个正常莫队了,这是根号的(求的是前缀所以你发现你更新桶的桶的时候不用把原来的踢掉)
FANER 来看我们啦(严肃接受到奶茶礼物),跟 CR 一起聊了一下,后面要开始重视基础了,这个过程还是很重要的
Day 12 - 9.12
(终于熬到最后一日了吗,要累飞我了TwT)
NOIP模拟赛 Round 4
挂分大作战,我严肃挂 60 分,申请挑战
1.道路开放 road
思维含量为 0,代码难度 INF。你只需要 set 维护一下连续段和答案就可以了,但是 corner case 真的多
2.区间划分 segment
部分分启发正解题。你考虑最后一个部分分“每个环均为 \(1\) 个连续区间”,手玩一下发现这是个仙人掌就意味着当且仅当包含至少两个完整的环时不合法,那你考虑 \(\operatorname{dfs}\) 的过程中你就可以把所有环弄下来,每个环只用记录边编号最小值和最大值,那你就把每个环形式化成了一个区间,你考虑这个东西很经典,可以用维护一下每个点最远走到哪儿,然后倍增优化一下就行了,\(O((n+q)\log n)\)
(一个下午好像不足以我弄懂 T3T4 中的任何一道题,我还是太区了)(下周沙坪坝的就要开始军训,只剩我们渝北的,就可以针对薄弱点和基础进行训练了)

浙公网安备 33010602011771号