不定期更新.
Ynoi 维修日志
对数据结构的爱……
联考出过的 Ynoi 题
联考题 | Ynoi题 |
---|---|
【六校联考省选#13】异构体 | Ynoi2018 五彩斑斓的世界 |
【六校联合省选#13】偏振光 | Ynoi2018 GOSICK |
【0905 联考】生命树 | Ynoi2019 美好的每一天~不连续的存在 |
【五校联考NOIP#11】树 | Ynoi2018 駄作 |
【五校联考NOIP#23】以诺 | Ynoi2013 无力回天NOI2017 |
# | 题目 | \(\texttt{Tag}\) | 完成情况 |
---|---|---|---|
Ynoi2011 T1 | 初始化 | 根号分治 | AC |
Ynoi2011 T2 | 遥远的过去 | Fhq_treap,hash | AC |
Ynoi2012 T1 | 惊惶的SCOI2016 | ||
Ynoi2012 T2 | NOIP2016人生巅峰 | bitset,树状数组 | AC |
Ynoi2012 T3 | WC,THUWC,CTSC与APIO2017 | ||
Ynoi2012 T4 | 梦断SCOI2017 | ||
Ynoi2013 T1 | 无力回天NOI2017 | 线性基,线段树 | AC |
Ynoi2013 T2 | 文化课 | ||
Ynoi2013 T3 | 对数据结构的爱 | 线段树,单调队列 | AC |
Ynoi2013 T4 | 大学 | 树状数组,dsu | AC |
Ynoi2013 T5 | D2T2 | ||
Ynoi2013 T6 | Ynoi | Trie,虚树 | 不会实现(还没人过?) |
Ynoi2014 T1 | 在太阳西斜的这个世界里 | ||
Ynoi2014 T2 | 置身天上之森 | ||
Ynoi2014 T3 | 等这场战争结束之后 | ||
Ynoi2014 T4 | 不归之人与望眼欲穿的人们 | ||
Ynoi2014 T5 | 人人本着正义之名 | Fhq_treap,位运算 | AC |
Ynoi2014 T6 | 长存不灭的过去,逐渐消失的未来 | ||
Ynoi2015 T1 | 我回来了 | 线段树 | AC |
Ynoi2015 T2 | 纵使日薄西山 | ||
Ynoi2015 T3 | 即便看不到未来 | ||
Ynoi2015 T4 | 此时此刻的光辉 | 分块,MR | AC |
Ynoi2015 T5 | 盼君勿忘 | ||
Ynoi2015 T6 | 世上最幸福的女孩 | ||
Ynoi2016 T1 | 炸脖龙I | ||
Ynoi2016 T2 | 掉进兔子洞 | 莫队,bitset | AC |
Ynoi2016 T3 | 这是我自己的发明 | ||
Ynoi2016 T4 | 镜中的昆虫 | AC | |
Ynoi2016 T5 | 谁的梦 | ||
Ynoi2016 T6 | 炸脖龙II | ||
Ynoi2017 T1 | 由乃的OJ | 线段树,位运算 | AC(远古代码) |
Ynoi2017 T2 | 由乃的玉米田 | ||
Ynoi2017 T3 | 由乃打扑克 | 分块 | 口胡,还没实现 |
Ynoi2018 T1 | 五彩斑斓的世界 | 第二分块,dsu | AC |
Ynoi2018 T2 | 末日时在做什么?有没有空?可以来拯救吗? | 第六分块 | 芜湖,被卡常ing |
Ynoi2018 T3 | 未来日记 | 第一分块 | |
Ynoi2018 T4 | 天降之物 | 第四分块 | |
Ynoi2018 T5 | GOSICK | 第十四分块 | 芜湖,被卡常ing |
Ynoi2018 T6 | 駄作 | 第七分块 | |
Ynoi2019模拟赛 T1 | Yuno loves sqrt technology I | 分块 | AC |
Ynoi2019模拟赛 T2 | Yuno loves sqrt technology II | 莫队二次离线,值域分块 | AC |
Ynoi2019模拟赛 T3 | Yuno loves sqrt technology III | 分块 | AC |
Ynoi2019 T1 | 魔法少女网站 | 第十分块 | 口胡AC |
Ynoi2019 T2 | Happy Sugar Life | 第十一分块 | |
Ynoi2019 T3 | 美好的每一天~不连续的存在 | 第十三分块 | 理解不能.jpg |
Ynoi2019 T4 | Another(暂未公开) | 第三分块 |
[Ynoi2011] 遥远的过去
Description
有一种字符集超大的 \(Z\) 语言,这种语言的特点是:
\(1.\) 字符集超大,有 \(2^{31}\) 种字符;
\(2.\) 每个单词由一系列两两不同的字符组成;
\(3.\) 字符既能比较相同和不同,也能比较大小;
\(4.\) 两个单词只要离散化后相同,则本质相同。
给定两个字符串 \(A,B\) ,求 \(B\) 作为子串在 \(A\) 中被匹配的次数。
有 \(q\) 次修改,每次修改 \(B\) 中的一个字符,计算匹配次数。
数据范围 \(n,m,q\le 10^5\) ,保证字符串时刻合法。
时间限制 \(\texttt{1000 ms}\)
空间限制 \(\texttt{512 MB}\)
Tag
Fhq_treap, hash
Solution
对于 \(A\) 的每连续 \(m\) 个数字,我们可以将其离散化后记为 \(\sum\limits_{i=1}^{m} a_i base^{m-i}\) ,其中
\(base=19260817,mod1=10^9+7,mod2=998244353\) 。
从 \([i,i+m-1]\) 到 \([i+1,i+m]\) ,相当于删去下标 \(i\) ,加上下标 \(i+m\) ,这可以用 \(Fhq\_Treap\) 快速维护。
同理维护 \(B\) 即可,每次修改即先 \(erase\) 一个数,再 \(insert\) 一个数。
时间复杂度 \(O(nlogn)\)
空间复杂度 \(O(n)\)
[Ynoi2012 T2] NOIP2016人生巅峰
Description
给定一个长为 \(n\) 的序列 \(a\) ,数的值域 \([0,v)\),有 \(2\) 种操作:
\(\texttt{1 l r}\) 询问区间内是否可以选出两个非空下标集合 \(X,Y\) ,满足:
\(1°\) \(X\) 和 \(Y\) 没有交集;
\(2°\) \(\sum\limits_{i\in X} (a_i+1)=\sum\limits_{i\in Y}(a_i+1)\) 。
如果可以选出,输出 Yuno
,否则输出 Yuki
。
\(\texttt{2 l r}\) 修改区间内的数,对于所有 \(l\le i\le r\) ,\(a_i\) 变为 \(a_i^3\ mod\ v\) ,即区间立方。
数据范围 \(1\le n,m\le 10^5,1\le v\le 1000\)
时间限制 \(\texttt{500 ms}\)
空间限制 \(\texttt{128 MB}\)
Tag
bitset,树状数组
Solution
区间内的子集数为 \(2^{r-l+1}\) ,每个区间的 \(sum\) 不超过 \(1000(r-l+1)\) 。
若 \(2^{r-l+1}>1000(r-l+1)\) ,即 \(r-l+1>13\) ,由抽屉原理知必有两集合 \(sum\) 相等,且不相交。
否则 \(r-l+1\le 13\) ,考虑 \(dp[i][j]=0/1\) 表示前 \(i\) 个数能否拼成 \(j\) 。
如果在某个 \(i\) 满足 \(dp[i][j]=1\) 且 \(dp[i][j-a[i]-1=1\) 则符合条件。这一过程可以用 \(bitset\) 优化。
区间修改直接用树状数组维护一下幂次即可,注意 \(v\le 1000\) ,可以很方便预处理 \(f[i][j]\) 表示 \(i^{3^{2^j}}\ mod\ v\) 的值。
时间复杂度 \(O(m(logn+\frac{16900}{\omega}))\) ,跑不满
空间复杂度 \(O(n)\) 。
[Ynoi2013 T1] 无力回天NOI2017
Description
给定一个长为 \(n\) 的序列 \(a\) ,实现两种操作:
-
区间 $[l,r] $ 内的所有数都 \(xor\) 上 \(v\) ;
-
查询区间 \([l,r]\) 内选任意个数(包括 \(0\) 个)的最大 \(xor\) 和是多少。
数据范围 \(1\le n,m\le 5\times 10^4, 0\le a_i,v\le 10^9\)
时间限制 \(\texttt{4000 ms}\)
空间限制 \(\texttt{128 MB}\)
Tag
线性基,线段树
Solution
区间修改线性基并不好维护,因此考虑差分。
定义 \(b_i= a_i\ xor\ a_{i-1}\) ,则 \(a_l,a_{l+1},...,a_r\) 的线性基等于 \(a_l,b_{l+1},b_{l+2},...,b_{r}\) 的线性基(因为 \(a_i\ xor\ a_j\ xor\ a_j=a_i\))。
对于一次修改,相当于在 \(b_l\) 和 \(b_{r+1}\) 上分别插入一个 \(v\) ,查询即得到 \(a_l\) 的值以及 \(b_{l+1},...,b_r\) 的线性基,插入 \(a_l\) 后求一次 \(.getans(x)\) 即可。
时间复杂度 \(O(qlognlog^2(max\{a_i\}))\) ,跑不满
空间复杂度 \(O(nlog(max\{a_i\}))\)
[Ynoi2013 T3] 对数据结构的爱
Description
定义函数
函数 \(f(l,r)\) 的伪代码:
result <- 0
for i <- l to r do
result <- add(result, a[i])
return result
给定一个长为 \(n\) 的序列 \(a\) 以及模数 \(p\),每次查询区间 \(f(l,r)\) 的值。
数据范围 \(1\le n\le 10^6, 1\le m\le 2\times 10^5,1\le p\le 10^9,-10^9\le a_i\le 10^9\)
时间限制 \(\texttt{2000 ms}\)
空间限制 \(\texttt{512 MB}\)
Tag
线段树,单调队列
Solution
区间 \([l,r]\) 的答案一定可以表示为 \(sum-xp\) ,\(x\) 表示减去 \(p\) 的次数,且显然有 \(0\le r-l+1\le p\) 。
考虑线段树,但发现初始值可能会对 \(x\) 产生影响,所以我们对于每个节点都记录 \(c[i]\) 表示区间 \(x=i\) 的最小初值。
显然,区间减去 \(x\) 的初始值范围为 \([c[x],c[x+1]-1]\) 。
分析节点 \(u\) 的合并,记两儿子为 \(ls\) 和 \(rs\) ,则有 \(c[x+y]=min\left\{ max(c[x],c[y]-(sum[ls]-xp)) \right\}\) 。
考虑什么情况下的 \(x,y\) 是合法的:如果 \(ls\) 最大初始值到都到达不了 \(rs\) 的最小初始值,那么就不合法,即 \((c[ls][x+1]-1)+(sum[ls]-xp)<c[rs][y]\) ,否则合法。
目前合并是 \(O(len^2)\) 的,考虑如何优化。
首先,对于合法的 \((x,y)\) 以及 \((x+1,y-1)\) ,\((x,y)\) 不劣于 \((x+1,y-1)\) ,因此随着 \(x\) 的递增,\(y\) 单调不减。
其次,因为要比较不合法的情况,所以还需满足对于任意 \(x\) ,有 \(c[ls][x+1]-c[ls][x]\ge p\) ,可感性理解,因为要多减一次就需要整体抬 \(p\) 。
这样,就可以通过单调队列优化到 \(O(len)\) 。
建树过程时间复杂度 \(O(nlogn)\) ,空间复杂度 \(O(nlogn)\) ;
查询的话,直接 \(query\) 了,查到对应区间二分一下,找到对应减去 $p $次数的区间即可,这里时间复杂度 \(O(qlog^2n)\) 。
时间复杂度 \(O(nlogn+qlog^2n)\)
空间复杂度 \(O(nlogn)\)
[Ynoi2013 T6] Ynoi
填个坑吧,放一下 \(sol\)
区间排序和区间异或会将原序列分成一些连续的段,其中一次排序操作会把区间内改为同一个新的连续段,一次异或操作会将区间端点处的段分裂为两段。显然在m次操作后,至多产生2m个新的连续段。对同一个连续段,每次排序会覆盖掉以前排序的效果,而相邻几次异或操作的效果可以叠加,所以一个连续段的信息可以用一个已排好序的序列异或上一个数表示。
为了处理连续段的变化,可以用平衡树维护序列中的连续段,通过打标记来处理操作。对每个连续段内部,用二进制trie维护序列。这里的trie较为特殊,为了节省空间,只维护叶节点构成的虚树,这样对一个长度为k的连续段,只需用一棵2k-1个点的trie表示。在trie上维护异或标记和排序标记(表示对这棵子树先排序后异或),其中异或标记的效果是对整棵子树内的值异或上一个数,而排序标记的效果是将整棵子树内由于异或而左子树大于右子树的点交换左右子树。打上排序标记前要先下传异或标记。在排序时会合并多个连续段,这时将每棵trie打上排序标记,利用trie的合并操作得到合并后的连续段。分裂连续段时可以用trie的分裂操作实现。
[Ynoi2015 T1] 我回来了
Description
有两种操作:
- 加入一个数 \(h\in [1,n]\)
- 查询 \([L,R]\) ,计算 \(\sum\limits_{x=L}^{R} f(x)\) ,其中 \(f(x)\) 表示最小的满足不存在 \(h\in [(f(x)-1)\times x+1,f(x)\times x]\) 的值。
数据范围 \(1\le n\le 10^5,1\le m\le 10^6\)
时间限制 \(\texttt{1000 ms}\)
空间限制 \(\texttt{256 MB}\)
Tag
线段树
Solution
可以发现,区间总个数是 \(\frac{n}{1}+\frac{n}{2}+...+\frac{n}{n}=O(nlogn)\) 的,所以重点在于快速处理区间移动。
这里可以通过线段树打个 \(vector\) 轻松实现,配合一个树状数组记录答案即可。
时间复杂度 \(O(mlogn)\)
空间复杂度 \(O(nlogn)\)
[Ynoi2015 T4] 此时此刻的光辉
Description
给定一个长为 \(n\) 的序列 \(a\) ,\(m\) 次询问,每次查询区间 \(d(\prod\limits_{i=l}^{r}a_i)\ mod\ 19260817\),\(d(x)\) 表示 \(x\) 的约数个数。
数据范围 \(1\le n,m\le 10^5, 1\le a_i\le 10^9\)
时间限制 \(\texttt{2500 ms}\)
空间限制 \(\texttt{512 MB}\)
Tag
分块,MR
Solution
对于一个 \(x\le 10^9\) ,它至多有两个 \(>^3\sqrt{x}\) 的质因子,所以预处理 \(\le 1000\) 的质数的指数前缀和。
对于 \(>1000\) 的质数,每个 \(a_i\) 最多有两个,因此莫队优化即可。
实测 \(\le 1000\) 的质数有 \(168\) 个,所以可以通过。
时间复杂度 \(O(168n+m(168+\sqrt{n}))\)
空间复杂度 \(O(168n)\)
[Ynoi2016 T2] 掉进兔子洞
太水了,直接塞代码……
时间复杂度 \(O(\frac{nm}{\omega}+n\sqrt{m})\)
空间复杂度 \(O(\frac{nm}{\omega})\) ,常数 \(\frac{1}{3}\)
[Ynoi2017 T3] 由乃打扑克
Description
给定一个长为 \(n\) 的序列 \(a\) ,\(m\) 次询问,支持两种操作:
-
查询区间 \([l,r]\) 的第 \(k\) 小值
-
区间 \([l,r]\) 加上 \(k\)
数据范围 \(1\le n,m\le 10^5, -2\times 10^4\le k,a_i \le 2\times 10^4\)
时间限制 \(\texttt{2000 ms}\)
空间限制 \(\texttt{128 MB}\)
Tag
分块
Solution
设块长是 \(x\) ,对于修改操作,整块复杂度 \(O(\frac{n}{x})\) ,零散块复杂度 \(O(x)\) ;
对于查询操作,二分答案,整块复杂度 \(O(\frac{n}{x}log(x))\) ,零散块复杂度 \(O(x)\) 。
根号平衡一下,取 \(x=\sqrt{nlogn}\) 时可做到 \(O(m\sqrt{nlogn}logn)\) ,然后芜湖 \(T\) 飞。
考虑将两个零散块归并在一起,形成一个“假块”。
查询总复杂度 \(O(\frac{n}{x}log(x)logn)\) ,修改复杂度 \(O(x+\frac{n}{x})\) ,取 \(x=\sqrt{n}logn\) 时可做到 \(O(m\sqrt{n}logn)\) ,可以通过。
时间复杂度 \(O(m\sqrt{n}logn)\)
空间复杂度 \(O(n)\)
Bonus
存在 \(O(m\sqrt{nlogn})\) 的做法。
做法基于复杂的多序列二分。
[Ynoi2018 T1] 五彩斑斓的世界
Description
给定一个长为 \(n\) 的序列 \(a\) ,\(m\) 次询问,支持两种操作:
- 将区间 \([l,r]\) 中 \(>x\) 的数减去 \(x\)
- 查询区间 \([l,r]\) 中 \(x\) 的出现次数
数据范围 \(1\le n\le 10^6, 1\le m\le 5\times 10^5, 1\le a_i,x\le 10^5+1\)
时间限制 \(\texttt{8000 ms}\)
空间限制 \(\texttt{64 MB}\)
Tag
第二分块,\(dsu\)
Solution
假设值域和 \(n\) 同阶,因为每次是减,所以最大值单调不增。
设当前操作为减 \(x\) ,当前最大值为 \(maxx\) ,则
-
若 \(maxx\ge 2\times x\) ,则可以将 \([1,x]\) 的数整体 \(+x\) ,然后整体减标记 \(+x\)
-
若 \(maxx<2\times x\) ,则暴力将 \([x+1,maxx]\) 的数 \(-x\)
可以发现,定义势能函数 \(\Phi=max-min\) ,每次操作使得 \(\Delta\Phi=x\) ,暴力操作至多 \(max-min\) 下 就会出现 \(\Phi=0\) ,因此暴力维护复杂度是对的。
关于整体平移,可以用 \(dsu\) 来维护,这里复杂度是 \(O(max\{a_i\}\alpha(max\{a_i\}))\) 的。
本题空间卡的很紧,可以考虑逐块处理的方式。对于整块直接平移(对于同一块来说,由势能函数知均摊 \(O(n\alpha(n))\)),散块暴力重构(因为对于一个查询最多 \(2\) 个散块,所以均摊 \(2m\) 次暴力重构,这里复杂度 \(O(m\sqrt{n})\) )。
时间复杂度 \(O(n\sqrt{m}\alpha(max\{a_i\}))\)
空间复杂度 \(O(n+m+max\{a_i\})\)
[Ynoi2019模拟赛 T1] Yuno loves sqrt technology I
Description
给定一个长为 \(n\) 的排列 \(a\) ,\(m\) 次询问, 每次查询一个区间的逆序对数。
强制在线
数据范围 \(1\le n,m\le 10^5\)
时间限制 \(\texttt{750 ms}\)
空间限制 \(\texttt{512 MB}\)
Tag
分块
Solution
简单处理一下块与块间贡献,块前后缀与块贡献即可。
两个零散块间贡献归并排序计算即可。
时间复杂度 \(O(n\sqrt{n})\)
空间复杂度 \(O(n\sqrt{n})\)
Bonus
存在低于 \(O(n\sqrt{n})\) 的做法。
[Ynoi2019模拟赛 T2] Yuno loves sqrt technology II
Description
给定一个长为 \(n\) 的序列 \(a\) ,\(m\) 次询问,每次查询区间逆序对数。
数据范围 \(1\le n,m\le 10^5,0\le a_i\le 10^9\)
时间限制 \(\texttt{250 ms}\)
空间限制 \(\texttt{32 MB}\)
Tag
莫队二次离线,值域分块
Solution
先将 \(a\) 序列离散化。
记 \(f([l,r],x)\) 表示 \(a[l..r]\) 中 \(>a[x]\) 的个数, \(g([l,r],x)\) 表示 \(a[l..r]\) 中 \(<a[x]\) 的个数。
例如,从 \([l,r]\) 到 \([l,r+1]\) ,\(\Delta = f([l,r],r+1)=f([1,r],r+1)-f([1,l-1],r+1)\) 。
\(f([1,x],x+1),g([1,x],x+1)\) 均可用树状数组 \(O(nlogn)\) 预处理。
对于 \(f([1,x],l)..f([1,x],r)\) 考虑 \(O(\sqrt{n})\) 插入,\(O(1)\) 查询的值域分块。用 \(sum[x]\) 表示块与块间的贡献,\(qwq[x][i]\) 表示块内前后缀贡献。简单维护即可。
时间复杂度 \(O(n\sqrt{n})\)
空间复杂度 \(O(n)\)
Bonus
存在低于 \(O(n\sqrt{n})\) 的做法。
[Ynoi2019模拟赛 T3] Yuno loves sqrt technology III
Description
给定一个长为 \(n\) 的序列 \(a\) ,\(m\) 次询问,每次查询区间众数出现次数。
强制在线
数据范围 \(1\le n,m\le 5\times 10^5, 0\le a_i\le 10^9\)
时间限制 \(\texttt{2000 ms}\)
空间限制 \(\texttt{64 MB}\)
Tag
分块
Solution
显然 \([l,r]\) 到 \([l,r+1]\) 众数出现次数至多增加 \(1\) 。
因此预处理 \(F[l][r]\) 表示从块 \(l\) 到块 \(r\) 的区间众数,用 \(vector\) 存每个数出现的下标,然后两边零散块内暴力跑即可。
时间复杂度 \(O(n\sqrt{n})\)
空间复杂度 \(O(n)\)
Bonus
存在 \(O(n^{\sqrt{2}})\) 的做法,依赖快速矩阵乘法而\(\texttt{not practical}\)。