Gym103855 M(切比雪夫距离)

M.Short Question

  题意:求i=1nj=1nmin(|pipj|,|qiqj|)的值
  首先带上绝对值来计算不太方便,所以对原有的序列p,q都先排个序,这样就可以直接拿掉绝对值并且转化为求2×i=1nj=1i1(aiaj),我们将这个式子先展开为2×i=1n((i1)×aij=1i1aj)2×(i=1n(i1)×aii=1nj=1i1aj), 将i=1nj=1i1aj展开,会得到(n1)a1+(n2)×a2+(ni)×ai++(nn)an,也就是i=1n(ni)ai,所以原式可以合并为2×i=1n((i1)ai(ni)ai)2×i=1n(2×in1)×ai,这样就将复杂的两个求和符号和绝对值转化成了只有一个线性的求和。

auto calc = [&](std::vector<i64>& x) -> i64 { i64 ans = 0; rep(i,0,n) { ans += (2LL * i - n + 1) * x[i]; } return ans * 2LL; };

  那么现在就需要去考虑min(pipj,qiqj)该怎么转化了.
  很显然有一个恒等式min(a,b)a+bmax(a,b),也就将min(pipj,qiqj)转化成了pi+qjpjqjmax(pipj,qiqj)这里的max(pipj,qiqj)要将它看成是一个(pi,qi),(pj,qj)之间的切比雪夫距离,而切比雪夫距离和曼哈顿距离的转化关系是这样的

将曼哈顿距离转化为切比雪夫距离: A(x,y)A(x+y,xy)A(xy,x+y)
将切比雪夫距离转化为曼哈顿距离: A(x,y)A(x+y2,xy2)A(xy2,x+y2)

证明切比雪夫距离和曼哈顿距离的转化及证明
  有了这个结论,那么就可以将(pipj,qiqj)映射成(pipj+qiqj2,pipjqi+qj2)(0,0)的曼哈顿距离,也就是将max(pipj,qiqj)转化成|pi+qipjqj|+|piqipj+qj|2, 此时可以将ai=pi+qi,bi=piqi,简化为|aiaj|+|bibj|2
  这样就把原问题转化成了2×i=1n(2×in1)×(pi+qi12×(ai+bi))

int n; std::cin >> n; std::vector<i64> a(n), b(n), p(n), q(n); for (auto& x : p) std::cin >> x; for (auto& x : q) std::cin >> x; rep(i,0,n) a[i] = p[i] + q[i], b[i] = p[i] - q[i]; std::sort(all(a)), std::sort(all(b)), std::sort(all(p)), std::sort(all(q)); auto calc = [&](std::vector<i64>& x) -> i64 { i64 ans = 0; rep(i,0,n) { ans += (2LL * i - n + 1) * x[i]; } return ans * 2LL; }; std::cout << calc(p) + calc(q) - (calc(a) + calc(b)) / 2 << "\n";

__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16721341.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示