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

P5062 在太阳西斜的这个世界里 3/11
题解

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\) 的形式,对每种余数维护一个答案就完了。

posted @ 2025-05-12 11:51  wjwweiwei  阅读(33)  评论(0)    收藏  举报