题解:P11214 【MX-J8-T2】黑洞
非常难的一道题,想了
根据题意,对每一维同时增加或减少一个正整数
把每一维对应成一根竹竿,表示 能够增减的范围,以 样例 #3 为例:
方便起见,调换这些竹竿的方向,把距离
因为有竹竿
也就是说,对于所有输入,可以转化成
考虑第
答案是
时间复杂度
#include <bits/stdc++.h>
#define u64 unsigned long long
#define inf 0x3f3f3f3f3f3f3f3f
#define i64 long long
const i64 MAXN = 2e5 + 64;
const i64 MOD = 1000000007;
#define mod(x) ((x) % MOD)
i64 m[MAXN], a[MAXN], n;
i64 x[MAXN], L = inf, sigp;
void solve()
{
assert(scanf("%lld", &n));
for (i64 i = 1; i <= n; ++i) assert(scanf("%lld", &m[i]));
for (i64 i = 1; i <= n; ++i) assert(scanf("%lld", &a[i]));
for (i64 i = 1, l; i <= n; ++i)
{
l = m[i] - a[i], x[i] = a[i] - 1;
if (l < x[i]) std::swap(l, x[i]);
L = std::min(L, l);
}
for (i64 i = 1; i <= n; ++i) x[i] = std::min(L, x[i]);
std::sort(x + 1, x + 1 + n, std::less<i64>());
for (i64 i = n, k = 2; i; --i, k = mod(k << 1))
{
sigp = mod(sigp + (x[i] - x[i - 1]) * k);
}
printf("%lld\n", mod(1 + sigp + (L - x[n])));
}
signed main()
{
solve();
return 0;
}