Sakura no Uta & Ynoi1998

最近把樱之诗打了,顺便补一下这几个题,重新理了下思路。

三个题目当中最喜欢 P12084,还有不难看出出题人是 yumi 推百合nb

虽然我推禀,但是 Rina 和 Yumi 也很可爱就是了

P12082 Frühlingsbeginn

不带修版本是经典问题,扫描线维护线段树就行,但这么做不好扩展。

记一个询问为 \((t,L,R)\),一个线段为 \((l,r,tl,tr)\),一个线段能被询问用上时满足 \(t\in[tl,tr],[l,r]\in[L,R]\),发现这是个三维偏序不太好处理,考虑分治降维。

考虑按猫树的形式,分治到 \([pl,pr]\) 时考虑 \(pl\leq L \leq mid \leq R \leq pr\) 的询问,分类讨论 \((l,r,tl,tr)\) 线段是否跨越 \(mid\) 并分算它们的贡献。

对于跨越 \(mid\),我们只需要求出这些线段覆盖的最左和最右位置就行,左侧右侧是类似的,以右侧举例,求的就是 \(\max r\),满足 \(r\leq pr,l\ge pl,t\in [tl,tr]\),是三维偏序的形式,考虑 cdq 分治一下,然后维护 \(t\) 的单修区间最值线段树即可。

不跨越时分左边右边两种情况,也是类似的,只考虑右边,扫描线 \(R\),维护时间轴的线段树,值为能覆盖到的最小的 \(L\),扫描线移动 \(R \rightarrow R+1\) 时,修改就是个区间取 \(\min\),还要注意有的位置没被覆盖到(不合法)的要删去。

对于一个线段而言,对分治区间有贡献肯定满足 \([l,r] \in [pl,pr]\),所以一个线段最多出现 \(\log\) 次。

总复杂度 \(n\log^2 n\),轻度卡常。

P12083 [Ynoi1998] Marchen

区间升序三元组计数(之前想过这东西,但没想到真有人出,还卡进 2s 了)

不弱于区间顺序对,考虑根号,又强制在线,考虑分块。

汲取 P5046,P6579 被爆的教训,直接分块做需要大分讨,非常恶心而且常数巨大。这里通过一些容斥和坐标轴翻转的技巧效果拔群。

这里参考 @wzr0507 的做法。

考虑翻转值域跟位置,翻转过后变成求全局升序三元组,并且要满足 \([a_i,a_k]\in [l,r]\)

这样做的好处是只存在整块,对于整块内部离散化后值域为 \(O(B)\),可以提前 \(O(B^2)\) 求出整块内部的贡献,是简单的。

然后对于 \(i,j,k\) 当中有两个同块的情况,不妨 \(i,j\) 同块,有 \([l\le a_i < a_j < a_k \le r]=[l \le a_i < a_j < a_k]-[l\le a_i < a_j][r < a_k]\),然后就比较好做了,对于块内预处理,从左往右扫就行。

三个都不同块时,\([l \le a_i < a_j][a_j < a_k \le r]=([a_i < a_j]-[a_i<a_j][l>a_i])([a_j<a_k]-[a_j<a_k][r<a_k])\),拆开过后四个情况分别做就行。

在这里容斥的优越性体现的比 P6579 更加明显。

P12084 [Ynoi1998] ZYPRESSEN

最厉害的一个题,最后关于支配对的部分真的神了,题目背景也很喜欢。yumi

先值域分块,按值域 \([2^k,2^{k+1})\) 为第 \(k\) 块。三个同块的数一定能组成三角形。

考虑从小到大,找到第一个 \(x\) 满足第 \(x\) 块有不少于 \(3\) 个数。

对于选的边都在 \(1\) ~ \(x\) 块的情况,这些边只有 \(O(\log V)\) 条,暴力求它们的答案就行。

剩下的情况,由于第 \(x\) 块已经存在 \(3\) 个数,所以答案不超过 \(3\times (2^{x+1}-1)< 2^{x+3}-1\),所以最大边小于 \(2^{x+2}\),只会用块 1 ~ \(x+1\) 的边。

进一步考虑,此时最小边 \(a_i\) 一定 \(<2^x\),否则一定不优于把 \(x+1\) 块的边改为 \(x\) 块的边。

然而对于 \(a_i\) 要作为最小边,区间 \([l,r]\) 中于 \(a_i\) 同块的最多只能有 \(1\) 个(不包括自己),所以对于每个块而言,每个数作为最小边的可行的区间总共是 \(O(n)\) 的,总共就是 \(n\log V\) 的。

很神秘的是对于这些区间求出来的支配对数也是线性的。

考虑 \(a_x\) 为最小边,对于每个位置记 \(b_i=\lfloor \frac {a_i} {a_x} \rfloor\),此时不难有 \(|b_i-b_j|\le 1\)

对于 \(b_i=b_j\) 时,必定能组成三角形,我们不妨 \(i<j\),从左往右枚举 \(j\) 维护可选集 \(i\),发现每次加入 \(j\) 时所有 \(a_i \ge a_j\) 的全部被支配了,实际上我们是对每个 \(b_i\) 维护了个单调栈。对于 \(j\) 只会选栈顶,因为对于栈中满足 \(x<y<j,a_x<a_y<a_j\)\((x,j)\) 必定被 \((x,y)\) 支配,还有每次弹出的 \(i\) 是被 \(j\) 支配,所以要将 \((i,j,x)\) 也加入答案。

对于 \(|b_i-b_j|=1\) 时,不妨 \(i<j,b_j=b_i+1\),此时 \(j\) 一定只会选前面第一个 \(i\),原因是如果同时存在 \(x,y,x<y<j,b_x=b_y=b_j-1\),那么 \((x,j)\) 必定被 \((x,y)\) 支配,对于 \(b_j=b_i-1\) 的情况把序列翻转过来是相同的。

于是支配对总数是 \(n\log V\) 的,然后做二维数点即可,复杂度 \(n\log V\log n + q\log n\)

posted @ 2026-08-06 16:55  yzq_yzq  阅读(6)  评论(0)    收藏  举报