AT_abc318_f [ABC318F] Octopus
首先考虑如何判断当头部位于
显然可以排序后贪心将触手与宝藏配对。
然后考虑怎样的
- 头部位于
k_0 满足条件而头部位于k_0+1 不满足条件
在这种情况下,一定有这样的
解不等式得
- 头部位于
k_0 不满足条件而头部位于k_0+1 满足条件
在这种情况下,一定有这样的
解不等式得
至此,我们找出了所有分界点,所以相邻分界点内的点一定相同,即将所有分界点按升序排序后放入
时间复杂度
const int N = 205;
#define int ll
int n, x[N], l[N], s[N * N << 1], ans;
bool chk(int k)
{
priority_queue <int> q;
R(i, 1, n) q.push(abs(x[i] - k));
R(i, 1, n)
{
if (q.top() > l[i]) return false;
q.pop();
}
return true;
}
signed main()
{
cin >> n;
R(i, 1, n) cin >> x[i];
R(i, 1, n) cin >> l[i];
sort(l + 1, l + n + 1, greater <int> ());
int tot = 0;
R(i, 1, n)
{
R(j, 1, n)
{
s[++tot] = x[i] - l[j] - 1;
s[++tot] = x[i] + l[j];
}
}
sort(s + 1, s + tot + 1);
R(i, 2, tot)
{
if (chk(s[i])) ans += s[i] - s[i - 1];
}
cout << ans << endl;
return 0;
}