23.12 营业日志

发布时间 2023-12-07 21:58:32作者: purplevine

营业日志重新启动。

12.04 模拟赛

170,rk 9,A 没过,太丢脸了。

D 猜数

考虑朴素的 dp:\(f_{l, r} = \min\{ \max\{f_{l, k - 1}, f_{k + 1, r}\} + k \}\)

固定 \(l, r\) 从左往右移 \(k\),注意到 \(f_{k+1, r}\) 递减,\(f_{l, k-1}\) 递增,找那个临界点 \(k_0\),则在其左边一定会选择 \(k_0\),在其右边不确定。

题解告诉我们 \(r - k_0\)\(\dfrac{n}{\log n}\) 级别的。

在其右边,式子是 \(f_{k+1, r}+k\)。注意到这与 \(l\) 无关,\(l\) 只会影响 \(k\) 的取值范围,并且这个限制是不升的。因此,对于所有 \(r\) 相等的 \(f\),可以跑一次单调队列一起解决。

真的可以吗?但是状态数会爆。注意到只有 \(r - l \leq \dfrac{n}{\log n}\) 的状态是有用的,因此有用的状态数是 \(\dfrac{n^2}{\log n}\) 个。

空间会爆。注意到 \(r\) 离当前 \(r\) 的距离超过 \(\dfrac{n}{\log n}\) 的状态也是没用的,这样状态数就是 \(\dfrac{n^2}{\log^2 n}\) 了,这就能过了。

细节有点小多,总体还行。

#515569

12.05 模拟赛

打一半下去体测,100+0+0+0。

T2 神J上树

考虑单个操作,把 \(u \times dis(u, v)\) 看成在每条边上放一个 \(u\) 的权值,那么每次会走前缀 \(\min\),在上面加入一个点相当于进行 cmin 操作,查询是链查,上吉司机就行了。

好像有更好写的做法,但我没多想。

#517772

12.06 ACM

rk15,差一点 rk11,可惜。

B

多项式板子,P4233 套个求逆就行了。

结果 jiangly 的板子 T 了好久,导致我做了 2h 左右,对不起队友 /kt

#517342

C

赛时发现排序后每个数的贡献一定,因此一直在想怎么快速排序并更新答案。实际上好套路啊。

在值域上维护 difsum,当合并两值域时,答案是 \(cnt_l \cdot sum_r - cnt_r \cdot sum_l\),因此维护区间内点个数和点权和。

答案的左右端点之一会抵住某个点,因此本质只有 \(2n\) 种。结论是在离散化后的序列上答案单峰,可以二分差值的零点。

为了快速查询离散化序列的第 \(k\) 项,还用在线段树维护当前区间内不同值的个数。

核心代码:

int l = 0, r = s.tot() - 1;
LL res = -1;
while (l <= r) {
  int mid = l + r >> 1, x = s.kth(mid), y = s.kth(mid + 1);
  LL xv = calc(x, x + d), yv = calc(y, y + d);
  if (xv >= yv)
    res = std::max(res, xv), r = mid - 1;
  else
    l = mid + 1;
}
l = 1, r = s.tot();
while (l <= r) {
  int mid = l + r >> 1, x = s.kth(mid), y = s.kth(mid - 1);
  LL xv = calc(x - d, x), yv = calc(y - d, y);
  if (xv >= yv)
    res = std::max(res, xv), l = mid + 1;
  else
    r = mid - 1;
}

#517986

G

摘抄 计算小练习

做一些变换让两条线段在坐标轴上,则需要求 \(\displaystyle \int_0^b \int_0^d \sqrt{x^2+y^2} \text{d}x\text{d}y\)\(\newcommand\d[1] {\text{d}#1}\)

参考。

\[\begin{aligned} & \displaystyle \int_0^b \int_0^d \sqrt{x^2+y^2} \d{x}\d{y} \\ = & \int_0^b \int_{0}^{\frac{d}{b}x} \sqrt{x^2+y^2} \d{x}\d{y} + \int_0^b \int_{\frac{d}{b}x}^{d} \sqrt{x^2+y^2} \d{x}\d{y} \\ = & \int_0^{\arctan \frac{d}{b}} \int_{0}^{\frac{b}{\cos \theta}} r^2 \d{r} \d{\theta} \int_{\arctan \frac{d}{b}}^{\frac{\pi}{2}} \int_{0}^{\frac{d}{\sin \theta}} r^2 \d{r} \d{\theta} \\ = & \frac{b^3}{3} \int_0^{\arctan \frac{d}{b}} \frac{1}{\cos^3 \theta} \d{\theta} + \frac{d^3}{3} \int_{\arctan \frac{d}{b}}^{\frac{\pi}{2}} \frac{1}{\sin^3 \theta} \d{\theta} \\ = & \frac{b^3}{3} \int_0^{\arctan \frac{d}{b}} \frac{1}{\cos^3 \theta} \d{\theta} + \frac{d^3}{3} \int_{\arctan \frac{d}{b}}^{\frac{\pi}{2}} \frac{1}{\sin^3 \theta} \d{\theta} \\ \end{aligned} \]

极坐标代换:

图源:http://staff.ustc.edu.cn/~rui/ppt/math-analysis/chap10_2.html

中间一步拆分:注意到角度旋转时,顶点先抵住右边界、再抵住上边界,因此以对角线为界限拆分为两个三角形。

\(\displaystyle \int r \d{\theta} \d{r}\) 是许多阴影小块的面积,拼起来才是大圆(当然,这里是长方形。)

因为,本质上是分成许多小块,每块内近似取一样的答案。

\(r^2\) 来自于 \(\d{xy} \to r\d{r}\d{\theta}\)

\[\begin{aligned} & \int \cos^{-3} x \text{d}x \\ = & \frac{\sin x}{2 \cos^2 x} + \frac{\ln |\sec x + \tan x|}{2} + C \\ \end{aligned} \]

(这个看来只能慢慢学)

\[\begin{aligned} & \frac{b^3}{3} \int_0^{\arctan \frac{d}{b}} \frac{1}{\cos^3 \theta} \d{\theta} + \frac{d^3}{3} \int_{\arctan \frac{d}{b}}^{\frac{\pi}{2}} \frac{1}{\sin^3 \theta} \d{\theta} \\ = & \frac{b^3}{3} \int_0^{\arctan \frac{d}{b}} \frac{1}{\cos^3 \theta} \d{\theta} + \frac{d^3}{3} \int_{0}^{\frac{\pi}{2} - \arctan \frac{d}{b}} \frac{1}{\cos^3 \theta} \d{\theta} \end{aligned} \]

把式子代进去就行了。

#518185

D

H

K

如果一个人有多种操作,并且另一个人在他操作后赢了,那么他可以改变操作。

于是 \(n, m > 2\) 时只可能第一个人第一次操作后成功,或平局。

\(n, m = 2\) 时挺平凡。

判初始局面不可通过操作被排序。