首页 > 其他分享 >P3964 [TJOI2013] 松鼠聚会

P3964 [TJOI2013] 松鼠聚会

时间:2024-08-13 11:49:07浏览次数:8  
标签:i64 P3964 int sum 距离 TJOI2013 曼哈顿 松鼠 比雪夫

题意

给定 \(n\) 个点,求出一个点使得每个点到这个点的切比雪夫距离之和最小。

思路

首先,我们可以把题目中的切比雪夫距离转化为曼哈顿距离,因为我们知道形如 \((x, y)\) 点之间的曼哈顿距离等于 \((x + y, x - y)\) 点之间的切比雪夫距离,\((x, y)\) 点之间的切比雪夫距离等于 \(\left(\dfrac{x + y}{2}, \dfrac{x - y}{2}\right)\) 点之间的曼哈顿距离。所以我们可以先将这些点转化一下,用曼哈顿距离进行计算。

然后,题目转化为找到所有点到一个点的曼哈顿距离之和最小,所以我们先将 \(x, y\) 数组排序,然后分开考虑,设选择的点为 \(x_i\)(排序后)。

\(\sum x = (x_i - x_1) + (x_i - x_2) + (x_i - x_3) + \cdots + (x_i - x_i) + (x_{i + 1} - x_i) + (x_{i + 2} - x_i) + \cdots + (x_n - x_i) = i\cdot x_i - (n - i) x_i - \sum\limits_{j = 1}^{i}x_j + \sum\limits_{j = i + 1}^{n}x_j\)

\(y\) 同理,然后我们对于原坐标,用二分对应到排序后的数组,然后根据公式求出答案。

代码

为了避免小数,我们将所有的数字先乘以 2,然后在输出距离时,将距离 / 2。

#include <bits/stdc++.h>

using i64 = long long;
using namespace std;

const int N = 100010;

i64 n, x[N], y[N], cx[N], cy[N], sx[N], sy[N];

i64 sum(i64 a[], int l, int r) {
    if (l > r) return 0;
    return a[r] - a[l - 1];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x[i] >> y[i];
        x[i] *= 2, y[i] *= 2;
        i64 a = (x[i] + y[i]) / 2, b = (x[i] - y[i]) / 2;
        cx[i] = x[i] = a, cy[i] = y[i] = b;
    }

    sort(x + 1, x + n + 1);
    sort(y + 1, y + n + 1);
    for (int i = 1; i <= n; i++) sx[i] = x[i] + sx[i - 1];
    for (int i = 1; i <= n; i++) sy[i] = y[i] + sy[i - 1];
    i64 ans = 0x3f3f3f3f3f3f3f3f;
    for (int i = 1; i <= n; i++) {
        i64 mx = cx[i], my = cy[i];
        int px = lower_bound(x + 1, x + n + 1, mx) - x;
        int py = lower_bound(y + 1, y + n + 1, my) - y;
        i64 ans_x = px * mx - (n - px) * mx - sum(sx, 1, px) + sum(sx, px + 1, n);
        i64 ans_y = py * my - (n - py) * my - sum(sy, 1, py) + sum(sy, py + 1, n);
        ans = min(ans, ans_x + ans_y);
    }
    cout << ans / 2 << '\n';
    return 0;
}

标签:i64,P3964,int,sum,距离,TJOI2013,曼哈顿,松鼠,比雪夫
From: https://www.cnblogs.com/Yuan-Jiawei/p/18356587

相关文章

  • [题解]P3966 [TJOI2013] 单词
    P3966[TJOI2013]单词用\(p[i]\)来表示经过节点\(i\)的字符串个数。那么节点\(u\)的答案就是fail树上,以\(u\)为根的子树的\(p\)之和。由于我们已经计算了\(p[i]\),所以字符串\(i\)作为模式串本身&模式串前缀的情况已经考虑了。还需考虑\(i\)作为模式串后缀的情况,而只有fail树上......
  • P3964 [TJOI2013] 松鼠聚会
    原题链接题解对于\((a_1,b_1),(a_2,b_2)\)的切比雪夫距离,可以看做成\((\frac{a_1+b_1}{2},\frac{a_1-b_1}{2}),(\frac{a_2+b_2}{2},\frac{a_2-b_2}{2})\)的曼哈顿距离不信你分类讨论看看某一点到其他点的曼哈顿距离,等于所有小于该点和大于该点的x,y的坐标差之和code#incl......
  • 洛谷 U285997 松鼠没有家
    https://www.luogu.com.cn/problem/U285997#submit题目描述星斗大森林里有一棵参天巨树,树上有 nn 个结点,我们给它们编号 11~nn。松鼠每天从树的这头窜到那头,因为它不认真写信息学作业只想划树叶子(树上没办法划水啊),被妈妈给批评了,于是回不了家。现在松鼠想要知道,它从......
  • 树上点差分的经典应用 LuoguP3258松鼠的新家
    树上点差分的核心就是如何避免重复,即正确的运用差分数组例如a,b点路径上点权值加1,则把a,b路径找到,并找到其LCA,此时可以把a到根,b到根这两条路径看出两条链,把每条链看出我们熟悉的顺序差分结构.以其中一条链为例子,把a当成数组的起点,根当成数组的末尾,进行差分,显然有C[a]+......
  • P3258 [JLOI2014] 松鼠的新家
    原题链接题解1.小模拟+树上差分+lcacode#include<bits/stdc++.h>usingnamespacestd;inta[300006]={0};vector<int>G[300005];intdepth[500005]={0};intfa[500005][30]={0};inttree[500005]={0};voiddfs(intnow,intpre){fa[now][0]=pre;depth[n......
  • 三只松鼠坚持的“高端性价比”,也是零食行业通往未来的门票?
    文|螳螂观察作者|易不二没有成功的企业,只有时代的企业。从全球商业数百年的发展历史来看,一百年间有无数企业演绎了“诞生→发展→巅峰→衰亡”的宿命。即便此间已经走到了世界500强的企业,到现在存活下来的也仅有3%。时代的潮流总是在变,很难有能始终屹立在浪潮之巅的企业。但那......
  • P4309 [TJOI2013] 最长上升子序列题解
    P4309[TJOI2013]最长上升子序列题解正文单调队列?单调锤子队列!!本题的操作可以省略成:单点修改区间查询好极了,此时我们有两种选择:线段树和树状数组,(平衡树,真不会,下一位因为不需要其他操作,所以我们还是选择更小巧更可爱的树状数组吧。关于vectorvector的insert操作支......
  • [TJOI2013] 松鼠聚会 题解
    [TJOI2013]松鼠聚会题解切比雪夫距离切比雪夫距离指的是在平面上的两个点\((x_1,y_1)\),\((x_2,y_2)\)之间横纵坐标之差绝对值中的大者。用公式表示则是\(f(a,b)=max(|x_a-x_b|,|y_a-y_b|)\)。切比雪夫距离与曼哈顿距离之间可以相互转换切比雪夫—>曼哈顿:\((x_1,y_1)\),\((x......
  • 「JLOI2014」松鼠的新家 题解
    「JLOI2014」松鼠的新家前言这道题倒也不是很难,只是有一些小坑需要避一下,可以看作半个LCA树上差分裸题。解析考虑维护一个树,点\(u\)表示每个房间需要的糖果数\(s_u\),而维尼在参观房间时从\(a\)到\(b\)就需要在\((a,\tob)\)的路径上的每个房间都摆上一个糖果,这时直......
  • 松鼠智能AI:为您量身定制的chatgpt智能聊天机器人
    在当今的智能化时代,人工智能技术在各个领域都有着广泛的应用,其中聊天机器人更是得到了大家的热烈欢迎。然而,许多人在与AI聊天时却经常出现一种状况:聊天机器人明明有着强大的智能,却不能真正理解用户的需求,无法解答专业问题,经常给人一种“对牛弹琴”的感觉。为了解决这一问题,你可以尝......