ABC How E

学术版

@[Oier_szc](/user/368204) AC code: ```cpp #include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef long long ll; vector<ll> X1,X2,Y1,Y2; ll calc(vector<ll> &a){ sort(a.begin(),a.end()); vector<ll> b; b.clear(); for(int i=1;i<a.size();++i) b.push_back(a[i]-a[i-1]); ll res=0; for(int i=0;i<b.size();++i){ res+=b[i]*(i+1)*(b.size()-i); } return res; } int main(){ int n,x,y; scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d%d",&x,&y); if((x+y)%2==0){ X1.push_back((x+y)/2); Y1.push_back((y-x)/2); } else{ X2.push_back((x+y)/2); Y2.push_back((y-x+1)/2); } } ll ans=0; ans+=calc(X1); ans+=calc(X2); ans+=calc(Y1); ans+=calc(Y2); printf("%lld\n",ans); return 0; } ```
by Greenzhe @ 2024-04-27 21:47:11


@[Oier_szc](/user/368204) [jiangly的极简代码](https://atcoder.jp/contests/abc351/submissions/52875772)
by yyrwlj @ 2024-04-27 21:49:25


@[Oier_szc](/user/368204) 首先你把坐标归为两类(类似棋盘黑格白格)。所以在每类之间可以相互跳。对于这两类,分别把坐标重新编号(旋转 45°),然后问题转换为求任意两点之间曼哈顿距离和。
by Greenzhe @ 2024-04-27 21:50:15


然后考虑对 x 坐标和 y 坐标分别处理。 对于每个坐标先排个序、求差分。 然后就转换为差分序列里所有非空段的和。 考虑每个元素被哪些区间统计到。 然后做完了。
by Greenzhe @ 2024-04-27 21:52:49


@[Oier_szc](/user/368204) 绷我一开始想维护: $$\sum_{1 \le i < j \le n} \max(|x_i-x_j|,|y_i-y_j|)$$ 的时候打算无脑 $2$ 种情况扔进主席树里暴力,然后发现不对可以有简单做法。
by Composite_Function @ 2024-04-27 22:00:44


@[Composite_Function](/user/531746) +1,但是毒瘤主席树过的人确实不可能这么多()
by Oier_szc @ 2024-04-27 22:04:16


@[Oier_szc](/user/368204) 切比雪夫距离转曼哈顿。 ~~我还以为这已经这么众所周知了吗?~~ ~~所以是有其它做法吗?~~
by fresh_boy @ 2024-04-28 00:45:01


@[Oier_szc](/user/368204) 你需要知道这个: $\max\{x,y\} = \dfrac{x + y + |x - y|}{2}$。
by sgl654321 @ 2024-04-28 08:47:23


@[sgl654321](/user/525374) 卧槽/bx
by Oier_szc @ 2024-04-28 18:09:49


题已经A了,此帖结。
by Oier_szc @ 2024-04-28 18:10:26


|