取次花丛懒回顾


【题目描述】
G 市可以被描述为一个拥有 \(n\) 条横向街道、\(m\) 条纵向街道的城市。在本题中,我们约定:
? 每相邻的两条横向街道、纵向街道之间的距离都为 \(1\)
? 两点之间的距离定义为沿街道走的最短路程。
近日,一桩了不得的大事逼近了。
正是,G 市之主小 H,不知道多少岁的大寿就要来了!
小 L 要做的第一件事,就是确定一个为小 H 庆生辰的地点。他精心挑选了 \(A\) 个不错的候选地点,为了方便亲朋们抵达,这些候选的地点都位于街道的交叉路口。具体来说,第 \(i\) 个候选地点恰好位于第 \(A_{x_i}\) 条横向街道与第 \(A_{y_i}\) 条纵向街道的交叉路口。
接下来如何挑选这件事叫小 L 措手不及,一阵莫名紧张,向周围的 G市朋友们问道:“这这这,以往小 H 的生辰都是怎么过的?”
他们争先恐后、乱七八糟地答道:“很热闹噶!”
“也没怎么过,就瞎闹一通吧...”
在进一步的逼问下,小 L 终于了解到了,小 H 在整个 G 市,一共有\(B\) 个好友,每逢他的生辰,便会邀请这些人们齐聚一堂。于是小 L 搜集来了这 \(B\) 个人宅子的坐标。具体来说,第$ i$ 位朋友恰好住在第 \(B_{x_i}\) 条横向街道与第 \(B_{y_i}\) 条纵向街道的交叉路口。
这下事情就变得简单了起来。
小 L 准备挑选一个地点,使得所有这 B 位朋友赶过来的路程之和尽可能小。请你输出这个最小的路程之和。
【输入格式】
第一行两个数 \(n, m\)
第二行一个数 \(B\)
接下来 \(B\) 行,其中的第 \(i\) 行两个数 \(B_{x_i}\), \(B_{y_i}\)
接下来一行一个数$ A$。
接下来 \(A\) 行,其中的第 \(i\) 行两个数 \(A_{x_i}\),\(A_{y_i}\)
【输出格式】
一行一个数,表示在最优挑选地点的情况下,所有朋友赶过来的路程之和。
【数据范围】
对于所有数据,满足\(A, B ≤ 10^5\),$ n, m≤ 10^9$, \(1 ≤ A_{x_i}, B_{x_i} ≤ n\), \(1 ≤A_{y_i}, B_{y_i} ≤ m\)
对于 30% 的数据,满足 \(A, B ≤ 10^3\)
另有 20% 的数据,满足 \(n = 1\)
另有 20% 的数据,满足 \(n, m ≤ 10^5\)
【样例输入】

5 5
3
4 2
5 4
2 5
2
4 1
2 3

【样例输出】

9

既然是曼哈顿距离可以把\(x\)值和\(y\)值拆开讨论。思路比较明显,我们要想办法求出一个点的路程之和,也就是求出一个点的\(x\)坐标的路程之和与\(y\)坐标的路程之和。
考虑离线处理,由于\(x\)值的处理方法和\(y\)值的处理方法一样,后面只考虑一个。如果曼哈顿距离中的绝对值能拆开,也就是知道两边的大小,那就很好处理了。其实我们全部排个序就好了。那么全部排序完后按顺序遍历,如果是一个属于b的点就统计,属于a的店改变。维护处在这个点左边的\(a\)点有\(p\)个和右边的a点\(q\),然后每次向左移动x个,增加\((p-q)\times x\)个。

#include
#include
#include
using namespace std;
const int N=2e5+5;
int n,m,a,b,l1,r1,l2,r2;
int x[N],y[N],idx[N],idy[N];
long long s1,s2,ans[N],ret=1e18; 
int cmp1(int a,int b)
{
	return x[a]