简单记录-2
第二堆杂题
第一堆杂题是我从 2021.4.12 开始的做题记录的前 200 道,这里的第二堆则是 201 以后的(
这里的题目是按照我做的时间顺序排放的。
UPD 2022.5.15
201 | P4643 阿狸和桃子的游戏 [国家集训队]
洛谷 | P4643 阿狸和桃子的游戏 [国家集训队] [省选+/NOI-]
时隔 114514 年的更新。
考虑将边权转化到点上,无论是阿狸还是桃子同时取到两点,他们都可以获得 \(u+v+c\) 的权值;若是分取两端点,则最终答案可抵消为 \(u-v\) 或者 \(v−u.\)
然后排序即可,因为没保证输入的权值是偶数,所以先×2最后再除掉。
202 | P2863 The Cow Prom S
洛谷 | P2863 The Cow Prom S [普及+/提高]
又是时隔 114514 年的更新。
一道比较板子的 Tarjan 求 SCC 个数,直接写一个 Tarjan 即可。
203 | CF915E Physical Education Lessons
洛谷 RemoteJudge [提高+/省选-]
观察完这道就发现是一道 DS,而且还挺水的好像(
看到只有区间赋值的操作,所以就考虑用珂朵莉树来解决。很简单的乆切掉了(
最一开始单独统计答案,但是这样显然是会被卡掉的,所以后来改成在 \(Assign\) 的时候乆把答案修改掉。
复杂度是 \(O(n \log n)\) 的样子o(=•ェ•=)m
204 | P6792 区间和 [SNOI2020]
洛谷 | P6792 [SNOI2020] 区间和 [NOI/NOI+/CTSC]
年轻人的第一道黑题。
虽然是黑题但是数据水了,所以最终的难度并没有那么高,一个暴力修改的线段树 + 前缀和后缀和来维护最大字段和的 trick 就解决掉了(
因为我也是第一次写这个 trick 所以在这里简单记录一下。
对于每个结点我们要维护:区间和,区间最大前缀和,区间最大后缀和,区间最大子段和,那么在转移的时候,需要写出以下的 Pushup
:
I void Pushup(int x)
{
t[x].sm=t[lc(x)].sm+t[rc(x)].sm;
t[x].mx=Hmax(t[lc(x)].mx,t[rc(x)].mx);
t[x].mi=Hmin(t[lc(x)].mi,t[rc(x)].mi);
t[x].psm=Hmax(t[lc(x)].psm,t[lc(x)].sm+t[rc(x)].psm);
t[x].usm=Hmax(t[rc(x)].usm,t[lc(x)].usm+t[rc(x)].sm);
t[x].sbmx=Hmax(Hmax(t[lc(x)].sbmx,t[rc(x)].sbmx),t[lc(x)].usm+t[rc(x)].psm);
}
然后就是正常的操作,中间有一次 WA 是因为 Query
忘了写 Pushdown
.
注明:我过了这道题之后,这道题就被加了 Hack 数据,现在我这个做法已经过不了了,正解大约是势能线段树啥的
205 | P4301 新Nim游戏 [CQOI2013]
洛谷 | P4301 新Nim游戏 [CQOI2013] [省选+/NOI-]
显然我做这道题的原因不是因为初中班号是 4301.
如果不让对方赢,就不能让对方在自己选完后剩下的数中选出 xor 和为 0 的,也就是不能让线性基被插满或者存在不能插入的值(因为线性基内的数不能异或出来 0),所以我们在将数插入线性基的时候,不能插入的直接加到答案里。
206 | 鉄道旅行 [JOI 2015]
ATCoder | A - 鉄道旅行 (Railroad Trip)
说起来,这题是在 rui_er 的珂朵莉树题单里来着(
然而当我看这道题的想法从“看起来像是树”变成“其实是个序列”的时候,我就不知道怎么往珂朵莉树上想了,因为……差分 + 贪心还挺显然的(
考虑到路线固定,所以我们只需要知道一条道路要经过几次即可,然后对于每条边,要不然全买原价,要不然买一张 IC 卡再用 IC 卡,所以我们每次比较哪个更优就可以了,设当前边被用了 co
次,每次累加答案的时候整一个 ans+=max(a*co,b*co+c)
就行了。
之所以没放洛谷链接是因为这个题面确实没法看,也没有数据范围,还不如我直接看原题面。
207 | P3974 组合数学 [TJOI2015]
洛谷 | P3974 组合数学 [TJOI2015] [省选+/NOI-]
好喵一题。
其实做这道题只是在看自己之前的博客的时候想起来之前有个 Dilworth 定理,然后就随着一个博客(浅谈Dilworth定理 - cmwqf)学习的时候,找到了这道题。
众所周知题目名字里有啥,这道题就不用啥做,所以这道题用不到组合数学(
我们把这道题中的每个点 \((i,j)\) 拆成 \(val(i,j)\) 个点,然后把能够到达的点之间连边,最后变成了一个 DAG,题目所求就是求这个图的最小链的划分,根据 Dilworth 定理,这个 DAG 的最小链划分就等于它的最长反链的长度。
按照我们建图的操作来说的话,这个反链就是说的最长的不能到达的链,也就是说要求每个点的右上和左下矩阵中点权值的最大值,于是直接 DP 即可。
for(int i(1);i<=n;++i)
for(int j(m);j;--j)
{
f[i][j]=f[i-1][j+1]+a[i][j];
f[i][j]=Hmax(Hmax(f[i][j],f[i-1][j]),f[i][j+1]);
}
答案即为 f[n][1]
.
208 | CF1603B Flog Traveler
虽然但是,这题有一点恶心人,不能一遍写对就很烦。
看完题之后,有三个想法:BFS(最短路),DP,瞎搞。
首先排除瞎搞(
然后考虑 DP,然后考虑了半天没考虑出来,感觉 DP 不太能做的样子。于是就考虑建图跑最短路,但是想了想建出来的图可能有亿点大,于是需要寻求更好的建图方法(
然后就去看了线段树建图(
209 | 引越しできるかな?
210 | P4302 字符串折叠 [SCOI2003]
洛谷 | P4302 字符串折叠 [SCOI2003] [提高+/省选-]
考虑设计一个二维状态 \(f(l,r)\) 表示 \([l,r]\) 能缩成的最短的长度,显然当 \(l=r\) 的时候 \(f(l,r)=1\),然后再考虑其他的状态。
对于一个区间 \([l,r]\),要不然是由一个字符串反复出现组成的,要不然就能拆成能压缩的几个部分,于是我们只需要考虑如何把这个区间中的字串找出来即可,因为这道题的 \(n \le 100\),所以可以直接枚举区间长度的约数,这样的话,整体的复杂度就是 \(O(n^3 \log n).\)
210B | UVA1630 Folding
洛谷 RemoteJudge [省选+/NOI-]
原题
虽然这两道题就差一个输出不一样但是评级不一样(
既然要输出方案,了解到一个神秘操作叫做 stringstream
,可以直接把各种奇怪的类型转化为 string,比如说这个题:
int val(len/(i-l+1));
stringstream tmp;
string tms;
tmp<<val,tmp>>tms;
有一点方便的感。
(把上面的全划掉)
然而,我重写的 stringstream
错了,而且贼慢,所以就把 P4302 的代码复制过来,改成了记录倍数的转折点递归输出(
211 | P4342 Polygon [IOI1998]
洛谷 | P4342 Polygon [IOI1998] [提高+/省选-]
只能说是洛谷我谢谢你,这个输入数据太不纯净了点……
首先考虑断环为链,然后就变成了区间 DP,设 \(f(l,r)\) 为 \([l,r]\) 上最大的结果。
那么在没有负数的情况下,转移就是这样的:
但是这道题有负数,所以可能会存在负负得正的优美情况,所以我们还需要维护一个最小值 \(g(l,r)\),然后加法的转移不变,乘法的转移变为:
然后这题就结束了(
212 | CF149D Coloring Brackets
洛谷 RemoteJudge [普及+/提高]
先考虑最朴实的没有颜色的情况,我们用匹配的括号序列之间转移即可,即设状态为 \(f(l,r)\) 即可,但是这道题需要我们保证染色,所以我们需要考虑新的合并方式。
记录每个匹配括号的左端和右端颜色在状态里,即 \(f(l,r,colorleft,colorright).\)
首先考虑当 \([l,r]\) 是一个匹配串的时候的转移,显然需要枚举所有的颜色情况,并从 \([l+1,r-1]\) 转移过来,当然,为了满足题目的要求,转移相加的时候是有颜色限制的,如果相邻的括号相同那就需要跳过这个状态。
否则,我们 \([l,r]\) 不匹配的时候可以从 \([l,match_l]\) 和 \([match_l+1,r]\) 这两个匹配的序列转移过来,当然,前提是 \(match_l\) 和 \(match_l+1\) 这两个位置的颜色不能相同。
转移的话就是 \(f(l,r,i,j)\) 加上这两段相乘。
因为我们要从小的往大里转移,所以方便起见使用 DFS 转移。
213 | CF1617A Forbidden Subsequence
考完月考不知道干嘛,于是做个没啥用的智障题。
先排序然后遇到小串为 abc
的时候特判,先输出 c
再输出所有 b.
214 | CF1617B GCD Problem
来到机房不知道做啥,于是做个没啥用的智障题。
先对这个要求的形式进行一个转化:\(a + b + c = n \Rightarrow x \times c + y \times + c = n \Rightarrow c \times (x + y + 1) = n.\)
于是我们枚举 \(n\) 的因数,也就是这个 \(c\),然后再枚举 \(x\) 和 \(y\) 即可。
215 | CF1617C Paprika and Permutation
做完上一个之后不知道做啥,于是继续做个没啥用的智障题。
首先,题目要求将整个序列转化为一个 \(1\) 到 \(n\) 的排列,所以我们把已经符合条件的 \(a_i\) 扔掉不用管。
然后将剩下的排序,按照大小顺序去一个一个判断能不能往排列里面填,判断的依据是:对于一个数 \(x\),它在本题所述的变换中,只能变为自己本身或 \(\le \dfrac{x}{2}\) 的数,于是 \(x\) 越小,能变成的数的范围也就越小,所以我们贪心让小的数先去填补排列。
于是我们每次判断是否 \(\dfrac{x}{2} \ge i\) 即可。如果不行的话就说明不存在解,输出 \(-1\),否则累加答案。
216 | P4766 Outer space invaders [CERC2014]
洛谷 | P4766 Outer space invaders [省选+/NOI-]
莫名的感觉这个题实际上配不上紫题(
考虑我们如果要消灭时间 \(i\) 时的 Invaders,就要让打击功率为最远的 Invader 的距离。
设 \(f(l,r)\) 为清除存在时间在 \([l,r]\) 之间的 Invaders 所需要的最小功率。
假设区间 \([l,r]\) 中距离最远的 Invader 的时间点为 \(i\),则我们在清除它的时候就可以一起把时间点为 \(i\) 的 Invader 一起消灭,然后我们这个区间剩下的就是 \([l,i-1] \cup [i+1,r]\),于是我们在转移的时候枚举这个 \(i\) 即可,即 \(f(l,r) = \min\limits_{l_{id} \le i \le r_{id}}\{d_id + f(l,i-1) + f(i + 1,r)\}\),其中 \(id\) 是距离最远的 Invader 的编号。
217 | P2470 压缩 [SCOI2007]
洛谷 | P2470 压缩 [SCOI2007] [省选+/NOI-]
紫 40 AC 祭
我们考虑一个区间 \([l,r]\) 里面有 M 的情况是 \(f(l,r,1)\) 没有则为 \(f(l,r,0).\)
当区间里没有 M 的时候,如果可以从中间折叠,那么就更新 \(f(l,r,0)\),即 \(f(l,r,0) = \min\{f(l,r,0),f(l,mid,0)+1\}.\)
然后正常的转移就是枚举断点更新:
f[l][r][0]=Hmin(f[l][r][0],f[l][i][0]+r-i);
f[l][r][1]=Hmin(f[l][r][1],Hmin(f[l][i][0],f[l][i][1])+Hmin(f[i+1][r][0],f[i+1][r][1])+1);
懒了不想打公式
218 | P1043 数字游戏 [NOIP2003PJ]
洛谷 | P1043 数字游戏 [NOIP2003PJ] [普及+/提高]
2022 第一题(笑
\(f(l,r,k)\) 表示 \([l,r]\) 分成 \(k\) 段的最大值,\(g(l,r,k)\) 为同意义下的最小值。
处理一个前缀和然后暴力枚举分段即可。
219 | CF1615B And It's Non-Zero
因为如果让某一二进制位为 \(1\),那么就需要每个参与运算的数字二进制下这一位为 \(1\),所以处理出来有多少数有 \(1\),那么剩下的就是要去掉的。
220 | P6247 最近最远点对 [SDOI2012]
洛谷 | P6247 最近最远点对 [SDOI2012] [提高+/省选-]
不明白,为什么我的 KDT 会 T,摆烂交了个贪心。
贪心就是了,排序之后选一定长度的点,这题最小 13 就够。
221 | CF1615C Menorah
一共是四种状态 \(f(1,0)\ f(1,1)\ f(0,0)\ f(0,1)\)
于是我们的目标是 \(f(0,1)+f(1,1)=n\)
化简一下:
f(x,0) -> f(x,1) -> f(x,0),也就是说,奇数次操作会让不同状态变为相同状态,偶数次则为变回来。
反之亦然,奇数同变不同,偶数不同变同。
而显然我们只能 \(101010101……\) 这样的进行操作,于是奇数次的操作之后相当于所有的不同变成同,反之亦然。
因为每次对 \(f(1,0)\) 操作的时候会让 \(f(1,1)-1\),并让 \(f(0,0)+1\),所以只有 \(f(1,1)-f(0,1)=1\) 和 \(f(0,0)=f(1,0)\) 的时候可以去更新答案为 \(\min\{f(1,1)+f(0,1),f(0,0)+f(1,0)\}\),其实就是从奇偶考虑。
如果最后答案大于 \(n\) 显然不行,否则输出答案。
222 | P3038 Grass Planting G [USACO11DEC]
洛谷 | P3038 Grass Planting G [USACO11DEC] [提高+/省选-]
树剖复健成功,基本一次成功大约,没有遇到什么问题:)
223 | P2486 染色 [SDOI2011]
洛谷 | P2486 染色 [SDOI2011] [省选+/NOI-]
不得不说虽然长是长了点,树剖还是好玩的,对于我这种没有脑子的人来说,不用想就能打的东西太好了。
其实就是普通的树剖,然后我们在线段树内记录每个区间的左端颜色和右端颜色,在合并的时候注意一下,如果一样就让 valve-1
就行。
224 | P1505 旅游 [国家集训队]
洛谷 | P1505 旅游 [国家集训队] [省选+/NOI-]
我在上个题的时候曾经说过:
不得不说虽然长是长了点,树剖还是好玩的,对于我这种没有脑子的人来说,不用想就能打的东西太好了。
确实,于是这个题的代码长度就成为了我目前为止通过代码中最长的,415 行,7Kb。(当然,和我码风有空行有关系)
树剖部分基本是一遍写对的,最后错了半天是因为题目说的边的编号要是 \(0 \sim n-1\),但是我读入的时候忘了 +1,害的我把前面的重新看了一遍。。
但是还好这是 7Kb 的树剖而不是其它别的什么鬼东西。
225 | P3178 树上操作 [HAOI2015]
洛谷 | P3178 树上操作 [HAOI2015] [提高+/省选-]
开这个题的时候没想到因为期末考试复习一周多没去机房。。
假期的时候因为期末考试成绩的事情生气,所以就把这个题写完了,然后在家没调,早上来学校发现是线段树 Build
时给结点赋值错了,然后改完就对了。
226 | P6772 美食家 [NOI2020]
洛谷 | P6772 美食家 [NOI2020] [省选+/NOI-]
一份,长达,一年零五个月的代码。
大约在好久之前立了个 Flag:
大约是元旦之前就 99 粉了,当时就感到一丝危机,因为美食家这个题给我留下的阴影还是挺大的(
当时咋想的咱也不知道,总之就是一个奇怪的思路骗过了样例(?
当然当时的我就莫名的感觉到这个题复杂度的奇怪,那么,确实是挺奇怪的:\(O((5n)^3 \log T + k \dot (5n)^2 \log T).\)
当时我看到正解复杂度是这个玩意就觉得很淦,这东西不像是我能分析的出来的东西。
于是试着想些什么,首先这个题不像是图论之类,所以向着 DP 的方向考虑,考虑到数据范围,最后可能是个二维 DP 状态之类的(
那么就能设 \(f(i,j)\) 表示第 \(i\) 天在编号为 \(j\) 的城市,然后用枚举出边来更新,即 \(f(i,j)+v(j,k)\) 更新 \(f(i+w,k).\)
然后这样大约就能有 \(40\),复杂度大约是 \(O(T(n+m))\),但是想不出来什么更厉害的状态了……
所以可以优化么?好像可以,但是我只会矩阵,但是一般的矩阵都是加和且为逐项转移(如 \(f(i,j)\) 转移到 \(f(i,j+1)\) 这样)的,这个首先是取最大值,而且每次转移需要距离都为 \(w.\)
后者还比较好解决,因为 \(w \le 5\),所以拆点即可,前者的话……改变矩阵相乘的时候的合并方式(?
于是我就拉了,遂观 duyi 佬之题解,原来如此。
本来矩阵乘法的柿子为:
因为我们这里需要取最大值,考虑到转移方式,于是我们可以重新定义一种“类矩阵乘法”:
语言描述就是把原来的相乘求和改为了相加取最大值。
因为矩阵快速幂优化 DP 主要是用到了矩阵的结合律,而在这里重新定义的“类矩阵乘法”仍然符合矩阵结合律。
为了下面描述方便,把这种运算简记为 \(A \dagger B\)(莫名找到的小符号 \dagger
,即匕首,短剑)。
当 \(k = 0\),即没有美食节的时候,直接将一个点拆为 \(w\) 个点即可,也就是在相邻编号之间的点之间加入边权为 \(0\) 的边,然后把拆出来的最后一个点和第一个点建一条原本点权值的边,设转移矩阵为 \(M\),那么转移方程就是 \(f(i) = f(i-1) \dagger M\),答案即为 \((f(T),1) = (f(1) \dagger M^T,1)\),时间复杂度为 \(O((5n)^3 \log T).\)
再考虑 \(k \ne 10\) 的时候,因为题目数据保证了美食节分布在不同天,所以我们可以先排序,考虑其单独贡献,即在两个美食节之间单独进行转移,即为:\(g(i) = g(i-1) \dagger M\),转化到刚才的 DP 状态上,即,设本次时间为 \(t_i\),那么上次的时间即为 \(t_{i-1}\),那么每个美食节的贡献就是 \(f(t_i) = f(t_{i-1}) \dagger M^{t_i - t_{i-1}}\),最后再让 \((f(t_i),x_i)\) 加上 \(y_i\) 就计算出了贡献。
最后若转移到的时间不为 \(T\),再转移一次即可。若最后拆完后的第一个结点的权值仍为 \(\tt -INF\),那么就说明无解。
现在的复杂度是 \(O(k(5n)^3 \log T)\) 我们再把 \(M^{2^x}(x \in [0,30])\) 预处理出来,就能把复杂度降到 \(O((5n)^3 \log T + k \dot (5n)^2 \log T).\)
顺便,这次代码的 return 0
,叫做 HerikoDeltana_LG100FansAnniv
.
最后的 Anniv 是周年纪念的意思,因为明天就是来高中部一周年了,今天新实验班学弟学妹都来了(
嗯,没错,有学妹。
227 | P4069 游戏 [SDOI2016]
洛谷 | P4069 游戏 [SDOI2016] [省选+/NOI-]
调题历程。
这道题从昨天晚上 6:28 开题到现在 10:36 AC 耗时大约 7h,我是真的服了啊(
这个题中说到每次对于树上点权值修改的是一个和距离相关的一次函数,于是我们可以树剖然后把这些修改通过每次找 LCA 用李超线段树来维护,即插入线段(
挺简单的对吧,但是这么长时间没过去。
228 | CF932F Escape Through Leaf
洛谷RemoteJudge [NOI/NOI+/CTSC]
CodeForces 932F Escape Through Leaf
真正意义上的第一道正解黑题,不过也有可能是评高了,CF 上 2700 我也不知道什么水平,反正比我水平高就是了(
题目就令人很莫名不是么,很容易想到 DP:
但是这是个 \(O(n^2)\) 的 DP,于是我们考虑优化(
这个形式,多是个一次函数啊(呆
所以我们考虑把后面这些东西当作直线用李超线段树来维护,只不过需要还一些合并(
时间复杂度是 \(O(n \log n)\),但是好像不合并,用树剖也能 \(O(n \log^2 n)\) 的做?没去试(懒
229 | P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并
洛谷 | P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并 [省选+/NOI-]
我们需要对每个结点维护一个权值线段树,因为是一棵树,所以我们考虑把修改操作用树上差分来实现,因为可能值域重合,所以我们进行线段树合并(
230 | P4254 Blue Mary开公司 [JSOI2008]
洛谷 | P4254 Blue Mary开公司 [JSOI2008] [省选+/NOI-]
哇,李超线段树板子(
这个比板子还板子的李超线段树什么都不需要,只需要支持把直线插进去,然后查询最大值即可。
最一开始不知道什么地方写挂了,最后发现它最一开始给的是斜率和 \(x=1\) 的取值(
顺便吐槽一下这个样例,给了和没给没啥区别(
231 | P4655 Building Bridges [CEOI2017]
洛谷 | P4655 Building Bridges [CEOI2017] [省选+/NOI-]
哇,又是李超线段树(
首先有柿子(这里 \(w\) 是原题中 \(w\) 的前缀和):
设 \(g(x,j) = -2h(j)\times x+(f(j)+h(j)^2-w(j))\),则有:
于是我们只需要在转移的时候找到 \(h(i)\) 取最大值的对应 \(g(h(i),j)\) 即可,也就是把 \(g(x,j)\) 当作直线用李超线段树来维护。
232 | CF1615E Purple Crayon
最聪明的情况下,A 只会选叶子结点,剖出来链之后按照提议操作。
233 | P2680 运输计划 [NOIP2015TG]
洛谷 | P2680 运输计划 [NOIP2015TG] [省选+/NOI-]
树上差分 + LCA + 二分
Future Search Technology.
234 | P8110 矩阵 [Cnoi2021]
洛谷 | P8110 矩阵 [Cnoi2021] [普及/提高-]
碰见的题,拿来做做(
对于前三个部分分,直接暴力矩阵快速幂即可。对于全部数据的 \(n \le 10^5\),显然二维数组是开不下了,于是考虑优化,可以按照 \(k\) 的取值来分类:
-
\(k=0\) 时,直接输出 \(n \bmod k;\)
-
\(k=1\) 时,输出 \(A\) 的元素和,即 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}a_ib_j=(\sum\limits_{i=1}^{n}a_i)(\sum\limits_{i=1}^{n}b_i);\)
-
否则,由题意应输出 \(A^k\) 的元素和,即 \((\sum\limits_{i=1}^na_ib_i)^{k-1}*(\sum\limits_{i=1}^{n}a_i)(\sum\limits_{i=1}^{n}b_i).\)
234 | P2325 王室联邦 [SCOI2005]
洛谷 | P2325 王室联邦[SCOI2005] [提高+/省选-]
SDWC 提到的一种树上分块的思路,即在树上砸 \(O(\sqrt{n}))\) 个点(也就是分成 \(O(\sqrt{n})\) 个块),DFS 一遍即可,对于每个结点 \(x\) 枚举其儿子,把他们扔到当前的临时集合中,若当前的临时集合大于了要求的城市大小,那就新开一个以 \(x\) 为省会的城市,不断从临时集合中将结点放到新城市中,直到小于城市块大小,总体复杂度 \(O(n).\)
235 | P8113 自我主义的平衡者 [Cnoi2021]
洛谷 | P8113 自我主义的平衡者 [Cnoi2021]
最近的一道比赛题,还是 E 题,没太想到能被这么简单的水过去(
因为每个人评价的标准是当前的平均值和自己期望值之间的大小关系,而且每次对于平均值的贡献只有在当前平均值小于等于自己期望值的时候才会贡献一个最大值 \(m\),而且我们只需要求最大值和最小值,因此贪心的将期望值序列分别升序和降序排序即可求出最大值和最小值。
最一开始因为没看见那个小于等于只得了 90(
236 | P4168 [Violet]蒲公英
洛谷 | P4168 [Violet]蒲公英 [省选+/NOI-]
其实,我不太常写分块,平常区间问题想到的都是线段树或者 ODT.
上次练习和分块相关的题目,还是练习普通莫队的时候。
然而这道题需要强制在线,莫队就没用了。当然莫队是有在线化改造的,但是,本来就是暴力根号数据结构的莫队,再在线化改造之后更像分块了吧。
因为值域很大,我们不可能直接在值域上进行维护,所以需要离散化。
然后考虑暴力怎么做,显然,开桶对每个区间进行统计即可,那么我们考虑分块怎么做。显然对于询问区间端点所在块相邻的,直接暴力开桶统计。否则,我们先预处理出来每个块内众数出现的次数,复杂度为 \(O(\sqrt(n)\sqrt(n)\sqrt(n))\),然后我们可以直接利用中间块内信息辅助开桶统计。
237 | AT1219 歴史の研究
AT1219 歴史の研究 [省选+/NOI-]
一个断断续续调了一天半的回滚莫队。
大体思路就是一个块内的暴力修改,不在一个块内的莫队维护。
因为排序询问的时候错放在预处理前,错的很惨。
顺便,600 AC 祭,紫题 50 AC 祭。
238 | P2501 数字序列 [HAOI2006]
洛谷 | P2501 数字序列 [HAOI2006] [省选+/NOI-]
一道非常妙的题,第二问的解决方案很有意思,利用单调的序列的性质贪心找到最优的划分平台。
239 | P4027 货币兑换 [NOI2007]
P4027 货币兑换 [NOI2007] [省选+/NOI-]
这题就题面就很有意思,说明提示里面给做法:“必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币,每次卖出操作卖出所有的金券。”
那么我们就考虑每次拿不拿即可,设 \(f_i\) 为第 \(i\) 天能赚得的最大钱数,\(X_i,Y_i\) 分别为第 \(i\) 天用 \(f_i\) 可以换得的 \(A,B\) 的数量:
假如不卖出的话,\(f_i=\max\{f_i,f_{i-1}\};\)
假如卖出的话,\(f_i=\max\{a_i \times X_j + b_i \times Y_j\}=\max b_i\{\frac{a_i}{b_i} \times X_j + Y_j\}.\)
那么把后面这个东西看成直线表达式,就可以用李超线段树维护了。因为精度问题,这里使用了离散化,但是要注意的是使用 unique
去重的时候,不传参判浮点数相等会出现精度丢失了。(见这个讨论)
240 | P2466 Sue 的小球 [SDOI2008]
洛谷 | P2466 Sue 的小球 [SDOI2008] [省选+/NOI-]
最近不知道做啥题了,随便捡一些 DP 玩玩,虽然我 DP 不行才是找 DP 题做的原因。
显然要先根据 \(x\) 坐标排序。
这道题显然直接开二维数组来记录位置是不行的,所以用当前 \(x\) 坐标和当前到第几个了来作为状态。
241 | P4560 Wall [IOI2014]
洛谷 | P4560 Wall [IOI2014] [省选+/NOI-]
我的评价是:抽象,为啥这题是紫的?
感觉这个题完全配不上紫,很水的一个线段树,维护两个 TAG 每次下传的时候修改即可。
242 | P3066 Running Away From the Barn G [USACO12DEC]
洛谷 | P3066 Running Away From the Barn G [USACO12DEC] [提高+/省选-]
这题可以 \(O(n \log n)\) 的做,每次从它到根节点的树链上寻找深度小于 \(len\) 的点,然后差分统计答案即可。
243 | P1360 Gold Balanced Lineup G [USACO07MAR]
洛谷 | P1360 Gold Balanced Lineup G [USACO07MAR] [提高+/省选-]
可以处理出来前缀和,然后相同的增长区间就是两个差相等的值的位置之差。
不太会描述,不过确实挺好想,最一开始还以为 map
套 vector
过不去,后来发现是我多虑了(
244 | P8255 数学游戏 [NOIOL 2022 PJ]
洛谷 | P8255 数学游戏 [NOIOL 2022 PJ] [提高+/省选-]
说实话,这题我感觉评绿合适一点。
最一开始听说今年的 NOIOL 普及两蓝,以为又是坑蒙拐骗初学者场。刚才偶然想到,不如拿来一做。
首先是排除无解,\(x\) 不能整除 \(z\) 显然无解。
然后将 \(z\) 除以 \(x\),
设 \(d=\dfrac{\dfrac{z}{\gcd(x,z)}}{\gcd(\dfrac{z}{\gcd(x,z)},x)}\),\(d'=\dfrac{z}{\sqrt{\dfrac{z}{d}}}\),若 \(d' \times \gcd(d',x)=z\),那么 \(d'\) 就是所求的 \(y\),否则无解。
不过,写完这一堆之后,我觉得评蓝也不是不合适(
245 | P4116 QTree3
洛谷 | P4116 QTree3 [提高+/省选-]
简单复健了一下树剖。
246 | P4315 月下“毛景树”
洛谷 | P4315 月下“毛景树” [提高+/省选-]
同样是简单复建树剖,比较惊喜的是可以一遍 AC,之前的树剖还算是没忘(
这个题的线段树也不难,两个 tag,一个累加一个覆盖即可,保证覆盖在累加之前就行。