嗯这个没什么好记录的 纯粹的结论 但是在某些情况下需要对问题进行拆分才能使用
假设一个数轴上有很多个点 这些点上都有人 要把所有人移动到同一个点上 并且所移动的距离最短
结论:将有人的点按大小排序 再进行前缀和 刚好超过总人数一半的那个点(假设总人数为sum 那么累加的人数>= sum / 2 时 就满足条件)即为所求的移动距离最短点 同时 假设每个点上只有一个人 那么只需要先排序 再求出中位数 就可以求出最短距离(求的方法因题而异)

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
using ll = long long;

struct P
{
  int pos, val, id;
}a[N];

int main ()
{
  ios::sync_with_stdio(0), cin.tie(0);
  int n;cin >> n;
  for (int i = 1;i <= n; ++ i) {
    cin >> a[i].pos;
    a[i].id = i;
  }
  ll sum = 0;
  for (int i = 1;i <= n; ++ i) {
    cin >> a[i].val;
    sum += a[i].val;
  }
  sort(a + 1, a + n + 1, [](const P &u, const P &v){
    return u.pos < v.pos;
  });
  ll res = 0;
  for (int i = 1;i <= n; ++ i)
  {
    res += a[i].val;
    if (res >= sum / 2) {
      cout << a[i].id << '\n';
      break;
    }
  }
}