考虑大胆地将 n 条直线排序一下,再 (i, i + \lfloor \frac n 2 \rfloor) 配对。然后你发现这甚至是对的。
如果是赛时,几乎就不用管它了,我们已经完成了 Ag 中最难的一步!
考虑这个为什么是对的。对于已经配对好的直线来讲,别的不管怎么动贡献肯定都是直角,是没有影响的,因此忽略掉她们。注意到,从 i 到 \lfloor \frac n 2 \rfloor 之间的直线的数量(当然,只考虑剩下来的没被忽略掉的),与 i + \lfloor \frac n 2 \rfloor 到 n 之间的直线的数量,几乎是一样的,取决于 n 的奇偶性最多相差 1。
考虑 i + \lfloor \frac n 2 \rfloor 转动带来的变化,设其转动的锐角为 \delta。注意到那两部分间必然存在一部分,到 i + \lfloor \frac n 2 \rfloor 的角度全部增加,且增加了 \delta;而另一部分中有增有减,并且变化的幅度都不超过 \delta。由于数量相差不超过 1,以及 ,i + \lfloor \frac n 2 \rfloor 本身的增加,整体上是不减的。
如上图是几种情况。
const int N = 1e5 + 5;
const int rt = 2.5e4, m = 5e4;
int a[N], p[N];
bool cmp(int x, int y) { return a[x] < a[y]; }
void energy(int n, vector<int> v) {
F(i, 0, n - 1) a[i] = v[i], p[i] = i;
sort(p, p + n, cmp);
F(i, 1, n >> 1) {
int x = p[i - 1], y = p[i - 1 + (n >> 1)];
rotate({y}, ((v[x] + rt - v[y]) % m + m) % m);
}
}