Ynoi合集
慢慢写着。
Ynoi 2003
Day1
T1
P8527 樋口円香
如果固定了 \([l,r]\),很明显的,当你进行一次操作,将当前 \(L\) 的计数器加 \(1\) ,最后可以上一个卷积解决。
所以我们直接分块,散块直接暴力,整块则可以最后对于每块单独一次卷积。
复杂度是 \(O(n\sqrt{n\log n})\)。
(实际上用 998244353 做模数因为值域的原因会死,不过这不重要。)
Ynoi 2004
Day2
T2
P9058 rpmtdq
很经典(或者该说相当典呢?)的支配对。
点分治后将点按编号大小排序,令 \(f_i\) 为点 \(i\) 到分治中心的距离。
根据 \(a<b<c,f_b<f_c\) 则 \((a,c)\) 被 \((a,b)\) 支配,我们只用维护一个单调栈,满足每个时刻单调栈中的点互相有关。
再根据 \(a<b<c,f_a<f_b\) 则 \((a,c)\) 被 \((b,c)\) 支配,所以我们只要保证任意时刻单调栈相邻两个点有关系。
关系总数是 \(O(n\log n)\),复杂度 \(O(n\log^2 n)\)。
Ynoi 2005
Day2
T1
P8204 tdnmo
top cluster 板子。
对同一个簇内的询问进行回滚,将询问挂在下端点上,可以证明摊到每次询问上的代价为 \(O(\sqrt{n})\)。
Ynoi 2006
Day1
T1
P7880 rldcot
对于 lca,直接采用 dsu on tree。
然后这里就可以用支配对的 trick,此时对于编号对 \((a,b),(a,c),a<b<c\),则 \((a,c)\) 被 \((a,b)\) 支配。
所以在固定 lca 时,加入一个轻儿子内的点时,只有它在当前点集的前驱后继有用。
所以总的对数是 \(O(n\log n)\) 的,之后就是随便拆拆矩形转为矩形加单点查?
Day2
T1
P7897 spxmcq
离线将询问按 \(x\) 排序,容易均摊做到 \(O(n\log n)\)。
Ynoi 2009
Day1
T1
P6108 rprsvq
这个感觉就比较唐了,虽然还是想了好一会。
稍微复杂一点的式子都容易转为 \(\sum_{i=1}^n \frac{\binom{n}{i}}{i}\),然后这个可以差分/组合数递推式转子问题。
跟数据结构没啥关系。
Day2
T1
P6778 rpdq
莫队二次离线转为 \(O(n)\) 次根链加父边权,\(O(n\sqrt{q})\) 次根链查和。
采用 top cluster 树分块平衡,维护簇内树上前缀和及收缩树前缀和。
T3
P6780 pmrllcsrms
这场 EC-Final 挺有趣的。
按 \(c\) 定长分块,若 \(c\nmid n\) 则往后补 \(0\)。
区间查询则分为散块内与相邻块间贡献,散块内随便讨论。
对于块间,将相邻两个块并起来,问题可以转为 \(a_i+b_j,i<j\) 的最大值,其中 \(a_i\) 为第二个块内的前缀和,\(b_j\) 为第一个块的后缀和,这个是线段树可合并结构。
对于散块与整块的贡献,也是细细讨论就完了。
Ynoi 2012
Day1
T3
P5526 惊惶的 SCOI2016
呃呃,现在已经变成模板了?
我们可以对每种颜色考虑贡献,所以实际上相当于只有黑白两种颜色,每次翻转点的颜色,求树上同色连通块大小平方和。
你想到 qtree6 这道题的维护树上连通块的方法,应该考虑对其父边进行 link or cut。然后实际的连通块是去掉其所在连通块根结点。
那么剩下就是 LCT 维护子树基础操作?
Ynoi ER 2014
我们珂朵莉题评分怎么都如此低!!!
Day1
T1
T2
P5063 置身天上之森 3/11
令\(f(1)=g(1)=n,f(k)=\lfloor \frac{f(k-1)}{2}\rfloor,g(k)=\lceil \frac{g(k-1)}{2}\rceil\)
则第 \(k\) 层的线段树结点的长度上界为 \(g(k)\),下界为 \(f(k)\),且 \(g(k)-f(k)\le 1\)。
所以线段树一层长度不同的结点数为 \(O(1)\),则整棵树本质不同长度结点数为 \(O(\log n)\)。
考虑对每种长度的结点讨论,则操作形如区间加,单点修,区间 \(\le k\) 的点个数。
这个容易分块做到 \(n\sqrt{n\log n}\)。
而这些长度的出现次数形如 \(n,\frac{n}{2},\frac{n}{4}\dots\)。
所以复杂度加和仍然不变。

实际上还没有卡掉,甚至 \(O(n\sqrt{n}\log n)\) 都过了。
T3
P5064 等这场战争结束之后 4/11
对于第 \(k\) 大值问题,可以考虑值域分块,便可以实现 \(O(1)\) 加,\(O(\sqrt{n})\) 查。
将点按点权排序后分块。
操作形成一个操作树,可以在树上 dfs 处理询问。
用可撤销并查集维护合并过程,当一个询问的答案确定在某个块中,我们可以转为枚举块内的点是否在连通块中来确认答案。
这样时间是 \(O(n\sqrt{n\log n})\),空间随便逐块处理做到 \(O(n)\)。
实际可以用链表 \(O(1)\) 合并并查集信息,查询时将链表摊到数组上用 nth_element 求第 k 大,则可以做到时间 \(O(n\sqrt{n})\)。
Day2
T2
P5066 人人本着正义之名 4/11
显然操作 \([3,6]\) 等价于极长 \(1\) 段向左/右收缩延伸 \(1\) 的长度,于是直接用平衡树维护连续段,并维护子树内连续段的最短长度/距离,如果为 \(0\) 则暴力递归合并/消除段,均摊复杂度正确。
因为我不会 WBLT,所以我只能用 treap。被卡常了,卡疯了,换成 splay 才过。
lxl,god curse on you.
T3
P5067 长存不灭的过去、逐渐消逝的未来 5/11
题解
。。。可以降了,反正我够唐的。
Ynoi ER 2015
Day1
T1
P5068 我回来了
签到题(其实这道题被换过,它的前身应该更加签,只有 1 分)。
考虑维护每个伤害值对应的答案。因为是加数,容易发现如果能做到每次操作将某个值对应答案加 \(1\),操作次数是 \(O(n\ln n)\)。
然后就随便做了,每次暴力更新完一个位置的答案时,我们就将这个位置的数插入到其下一个对应的值域区间中,如果在某次加数后这个区间有值,它就一定会被更新。
复杂度 \(O(n\log^2 n)\)。
Ynoi 2018
Day2
T1
P5397 天降之物
弑尽破净的第四分块。6/11
考虑序列分块。
对于一个整块,进行块内离散化。记 \(to_{i,x}\) 为 \(i\) 块内 \(x\) 对应的映射编号。
则我们可以预处理出 \(val_{i,x,y}\) 表示 \(i\) 块内编号对 \((x,y)\) 的答案。
修改时 \(x\) 变为 \(y\)。
当 \(x\) 在当前块不存在,直接跳过。
当 \(x\) 存在但 \(y\) 不存在,直接令 \(to_{i,y}\leftarrow to_{i,x},to_{i,x}\leftarrow 0\)
当 \(x\) 存在,\(y\) 存在,则重构 \(to_{i,x}\) 与 \(to_{i,y}\) 相关的答案,因为这种情况会使块内的数种类减少 \(1\),所以每个块至多被重构 \(\sqrt{n}\) 次,每次 \(O(\sqrt{n})\) 复杂度,均摊正确。
接下来就是将全局搬到区间,散块的查询是可以直接双指针的,修改的话可以发现每次重构会至多使块内种数增加 \(1\),所以势能仍然正确。
我不会说我暴力没删虚空卡常 \(1\) 小时的。
T2
P5398 GOSICK
点缀光辉的第十四分块。8/11
采用莫队二离,于是你只用求 \(O(n\sqrt{n})\) 次 \(a_{[1,i]}\) 中 \(a_j\) 的倍数/因数。
倍数是好做的,加入 \(a_i\) 时对其因数贡献。
对于因数,考虑根号分治,对于 \(>\sqrt{n}\) 的 \(a_i\) 对其倍数进行贡献。
对于 \(\le\sqrt{n}\) 的 \(a_i\),直接对于每个 \(x\in [1,\sqrt{n}]\) 处理出 \([1,i]\) 区间中 \(x\) 的倍数及 \(x\) 的出现次数,因为莫队会有 \(O(n)\) 次连续移动,而这里移动的一段是可以 \(O(1)\) 计算的,所以这里复杂度是 \(O(n\sqrt{n})\)。
评测机抽风了,波动直接 22.09s->18.98s,成最优解了。
T3
P5399 駄作
????第七分块(不是,枯野瑛不写就不取了是吧)。10/11
上 top cluster,将两个邻域分别与每个簇取交,那么现在我们只用讨论块对块的贡献。
对于两个块 \(B1,B2\) 的贡献:
当 \(B1\neq B2\),对于一个询问可以直接在收缩树上进行树形 dp。
具体来说要处理出每个块中点的个数及点到界点的距离和。当此块中的中心点不是界点时,这种情况对于每个询问会出现 \(O(1)\) 次,于是可以 \(O(\sqrt{n})\) 暴力求得。否则可以预处理。
当 \(B1=B2\),且存在一种颜色的中心点不在界点上。
对每个询问会出现 \(O(1)\) 次,同样可以暴力 \(O(\sqrt{n})\) 处理出点集,再将 \(dis(x,y)\) 拆为 \(dep(x)+dep(y)-2dep(lca(x,y))\),于是转为\(O(\sqrt{n})\) 次根链加,\(O(\sqrt{n})\) 次根链查。由于修改在询问前所以可以加完后 dfs 块内处理答案,单次同样是 \(O(\sqrt{n})\) 的。
当 \(B1=B2\),且两种颜色的中心点都在界点上。
每个询问对每个块贡献 \(O(1)\) 次,于是可以离线下来逐块处理。这个是容易扫描处理的。每个块复杂度为 \(O(n)\)。
这个gal真是太好啦!
Ynoi 2019
Day1
T1
P6578 [Ynoi2019] 魔法少女网站
深潜循藏的第六分块。6/11
lxl 哈气哈出来的题,感觉可以踢出大分块了。
先序列分块,然后将答案拆为块内与跨过块的。
块内的答案可以考虑对每种块中出现的值预处理答案,也就是说可以预处理 \(f_{i,j}\) 表示第 \(i\) 个块中排名为 \(j\) 的答案。这个可以对块内排序,重构也是容易维护的。
所以我们只需要对每次查询给出的数 \(O(1)\) 求它在每个块中的排名就行了,可以值域分块平衡。
块间的同样可以以同样的方式处理出块内第一个/最后一个大于 \(x\) 的位置,可以逐块处理然后合并。
复杂度 \(O((n+q)\sqrt{n})\)。
Ynoi ER 2021
T3
P8513 TEST_136
有意思但没意思。
这个描述肯定是半平面数点,前置就是己酸集合。
对每种颜色按 \(B\) 分块,处理出块内点两两之间的斜率变化关系。
复杂度 \(O(\frac{\sum siz}{B}(B^2\log B+q\log B))\)
这样就完了?并不是,因为这里 \(\frac{siz}{B}\) 是上取整的,所以要是颜色种类是 \(O(n)\) 的就爆了。
不过这个也无关紧要,对 \(>B\) 的你采用这种做法,\(\le B\) 的你可以将颜色分组,让每一组的总个数是 \(O(B)\) 的,然后此时就需要维护每种颜色的排名、前缀和,这个随意用 BIT 查一下。
怎么还卡精度啊,我还要手写一个分数类。
Ynoi 2024
Day2
T2
P11369 弥留之国的爱丽丝
每 \(B\) 个操作分块,于是可以将点分为 \(B\) 次操作内出现的(可能是修改的边的端点)和没出现的点。
对于那些出现过的点,容易处理出它们之间的可达性。
于是操作只用对这 \(O(B)\) 个点进行,每次查询则可以 bfs 得出,且可以用 bitset 优化 bfs。
那么就做完了。
本来稍微想了想能不能平到单根,也就是把 \(O(B^2)\) 边数的图缩到 \(O(B)\),但是好像被二分图卡了?
T3
P11370 堕天作战/虚空处刑
题解
貌似存在很简短的随机化做法,待我看看。
upd:luogu数据能卡掉。
推荐写一下,很好写。
Ynoi ER 2024
T1
P9992 TEST_130
拆偏序,扫描线,做完了。
T2
P9993 TEST_133
口胡。
分块然后讨论散块/整块修改对散块/整块查询的影响。
何意味?
Ynoi April Fool's Round 2025
T3
P12014 牢帽
我们 April Fool's Round 难度的确是不好说。
实际上你发现它与 P10175 很像,然后就做完了?
还是回到 Ynoi 这道题,当 \(x\) 是 \(u\) 的倍数的时候,你可以在线段树分治时,对于每个连通块维护一个关于 \(x\) 的多项式,显然此时 \(x\) 的大于 \(v\) 的次项是无用的,所以此时合并复杂度就降下来了。
当 \(u\nmid x\) 时,可以将 \(u\) 表示为 \(kx+b\) 的形式,对每种余数维护一个答案就完了。

浙公网安备 33010602011771号