Source The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - Problem L
组团狙击 大 失 败,还是 Claris 比较快,
不过讲道理其他题都不是我做的,拼不过罚时也不能怪我现场没过这个没什么希望现场过的 L 题吧(正论)。
总之先画个图,
所求即为点
P
P
P 从
A
(
a
,
0
)
A(a,0)
A(a,0) 出发沿着椭圆
x
2
a
2
+
y
2
b
2
=
1
\frac{x^2}{a^2}+\frac{y^2}{b^2}=1
a2x2+b2y2=1 逆时针走
t
t
t 个单位长度之后,以
P
P
P 为中心
2
∣
y
P
∣
2|y_P|
2∣yP∣ 为边长的边与坐标轴平行的正方形
S
S
S 扫过的面积(这里无论正方形是否包含内部,结果都是一样的),
不难发现,上半平面和下半平面是完全独立的,记椭圆的周长为 c c c,那么只需要考虑 0 ≤ t ≤ c 2 0 \leq t \leq \frac{c}{2} 0≤t≤2c 的情况,
先考虑给定
P
P
P 计算
t
t
t 也就是从
A
A
A 出发沿着椭圆逆时针走到
P
P
P 的长度,令
{
x
P
=
a
cos
θ
,
y
P
=
b
sin
θ
,
\begin{cases} x_P=a\cos\theta,\\ y_P=b\sin\theta, \end{cases}
{xP=acosθ,yP=bsinθ, 那么有
t
=
∫
0
α
a
2
−
(
a
2
−
b
2
)
cos
2
θ
d
θ
,
t=\int_{0}^{\alpha}\sqrt{a^2-(a^2-b^2)\cos^2\theta}~d\theta,
t=∫0αa2−(a2−b2)cos2θ dθ, 其中
α
=
arccos
(
x
P
a
)
\alpha = \arccos(\frac{x_P}{a})
α=arccos(axP),就可以转化为第二类不完全椭圆积分,使用 std::tr1::ellint_2 函数进行计算,顺便也可以算出椭圆的周长
c
c
c,
现在对于给定的
α
\alpha
α,已经可以计算出
t
(
α
)
t(\alpha)
t(α),且易知
t
′
(
α
)
=
a
2
−
(
a
2
−
b
2
)
cos
2
α
t'(\alpha)=\sqrt{a^2-(a^2-b^2)\cos^2\alpha}
t′(α)=a2−(a2−b2)cos2α,就可以通过牛顿迭代在给定
t
t
t 时解出
α
\alpha
α,进而求出点
P
P
P 的坐标,实测取初值
π
2
\frac{\pi}{2}
2π 迭代
4
4
4 次精度就够了,
接下来考虑正方形
S
S
S 扫过的面积,分四种情况讨论,
第一种情况,椭圆在点
P
P
P 处的切线斜率
<
−
1
< -1
<−1,即
x
P
>
a
2
a
2
+
b
2
x_P > \frac{a^2}{\sqrt{a^2+b^2}}
xP>a2+b2a2,
此时扫过的面积就是
t
t
t 时刻正方形的面积
4
y
P
2
4y_P^2
4yP2,
第二种情况,椭圆在点
P
P
P 处的切线斜率
∈
[
−
1
,
0
]
\in [-1,0]
∈[−1,0],即
0
≤
x
P
≤
a
2
a
2
+
b
2
0 \leq x_P \leq \frac{a^2}{\sqrt{a^2+b^2}}
0≤xP≤a2+b2a2,
此时扫过的面积可以分为一个正方形的面积
4
y
P
2
4y_P^2
4yP2 和一个曲边梯形的面积,
而曲边梯形的面积可以继续分为一个矩形的面积
2
b
2
a
2
+
b
2
⋅
(
a
2
+
b
2
−
(
x
P
+
y
P
)
)
\frac{2b^2}{\sqrt{a^2+b^2}}\cdot(\sqrt{a^2+b^2}-(x_P+y_P))
a2+b22b2⋅(a2+b2−(xP+yP)) 和一个曲边三角形的面积,
不难求出正方形的右上角
Q
Q
Q 的轨迹方程为
(
x
−
y
/
2
)
2
a
2
+
y
2
4
b
2
=
1
,
\frac{(x-y/2)^2}{a^2}+\frac{y^2}{4b^2}=1,
a2(x−y/2)2+4b2y2=1, 那么曲边三角形的面积为
s
=
∫
2
b
2
a
2
+
b
2
2
y
P
(
x
(
y
)
−
(
x
P
+
y
P
)
)
d
y
=
∫
2
b
2
a
2
+
b
2
2
y
P
(
a
1
−
y
2
4
b
2
+
y
2
−
(
x
P
+
y
P
)
)
d
y
,
s=\int_{\frac{2b^2}{\sqrt{a^2+b^2}}}^{2y_P}(x(y)-(x_P+y_P))~dy=\int_{\frac{2b^2}{\sqrt{a^2+b^2}}}^{2y_P}(a\sqrt{1-\frac{y^2}{4b^2}}+\frac{y}{2}-(x_P+y_P))~dy,
s=∫a2+b22b22yP(x(y)−(xP+yP)) dy=∫a2+b22b22yP(a1−4b2y2+2y−(xP+yP)) dy, 这个积分比较基础,这里就不展开了,
第三种情况,椭圆在点
P
P
P 处的切线斜率
>
1
>1
>1,即
x
P
<
−
a
2
a
2
+
b
2
x_P < -\frac{a^2}{\sqrt{a^2+b^2}}
xP<−a2+b2a2,
此时扫过的面积就是一整块的面积,可以转化成第二种情况代入横坐标
0
0
0 进行计算,
第四种情况,椭圆在点
P
P
P 处的切线斜率
∈
(
0
,
1
]
\in (0,1]
∈(0,1],即
−
a
2
a
2
+
b
2
≤
x
P
<
0
-\frac{a^2}{\sqrt{a^2+b^2}} \leq x_P < 0
−a2+b2a2≤xP<0,
此时扫过的面积是第三种情况中一整块的面积减去一个曲边梯形的面积,而曲边梯形的面积可以转化成第二种情况代入横坐标
−
x
P
-x_P
−xP 进行计算,
至此所有情况都讨论完了,由于数据组数较多,还需要精细地实现以避免超时。
2025.01.09更新:当年在ZOJ上的代码已经找不回来了,在QOJ重新写了一份。