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

[TJOI2013] 松鼠聚会 题解

时间:2023-10-27 17:36:00浏览次数:34  
标签:frac 曼哈顿 题解 比雪夫 距离 TJOI2013 坐标 松鼠 include

[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_2,y_2)\)->\((\frac{x_1+y_1}{2},\frac{x_1-y_1}{2})\),\((\frac{x_2+y_2}{2},\frac{x_2-y_2}{2})\)

曼哈顿—>切比雪夫:\((x_1,y_1)\),\((x_2,y_2)\)->\((x_1+y_1,x_1-y_1)\),\((x_2+y_2,x_2-y_2)\)

这样就可以将切比雪夫距离转化为曼哈顿距离进行计算了。

好的,那么这道题就将切比雪夫下的坐标转化成曼哈顿下的坐标即可。为了防止浮点数对时间复杂度的影响,我们转化时先不除二,等到判断时再除二。

那么如何快速求出曼哈顿距离之和呢

可以考虑到,我们以\(x\)为关键字按升序排序,那么我们求解\(x\)坐标的差值的绝对值时就只需进行前缀和即可,对于\(y\)坐标,我们只需排序,然后对于一个点,我们进行二分查找其对应\(y\)坐标在有序数列中的位置,然后再进行前缀和即可。

代码

/*
 * Author:Ehundategh
 * Update:2023/10/10
 * Title:squ.cpp
 * You steal,I kill
 */
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 100010
using namespace std;
struct node{
    long long X,Y;
}Node[MAXN];
bool cmp(node a,node b){return a.X<b.X;}
long long n,PreX[MAXN],PreY[MAXN],CopyY[MAXN],Ans=0x7fffffffffffffff;
node Change(node a){
    int Temp=a.X;
    a.X=a.X+a.Y;
    a.Y=Temp-a.Y;
    return a;
}
long long Check(int Pos){
    long long Ret=0,Y=Node[Pos].Y;
    Ret+=(Pos-1)*Node[Pos].X-PreX[Pos-1];
    Ret+=PreX[n]-PreX[Pos]-(n-Pos)*Node[Pos].X;
    Pos=lower_bound(CopyY+1,CopyY+n+1,Node[Pos].Y)-CopyY;
    Ret+=(Pos-1)*Y-PreY[Pos-1];
    Ret+=PreY[n]-PreY[Pos]-(n-Pos)*Y;
    return Ret>>1;
}
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&Node[i].X,&Node[i].Y);
        Node[i]=Change(Node[i]);        
        CopyY[i]=Node[i].Y;
    }
    sort(CopyY+1,CopyY+n+1);
    sort(Node+1,Node+n+1,cmp);
    for(int i=1;i<=n;i++){
        PreX[i]=PreX[i-1]+Node[i].X;
        PreY[i]=PreY[i-1]+CopyY[i];
    }
    for(int i=1;i<=n;i++){
        Ans=min(Check(i),Ans);
    }
    printf("%lld",Ans);
    return 0;
}

标签:frac,曼哈顿,题解,比雪夫,距离,TJOI2013,坐标,松鼠,include
From: https://www.cnblogs.com/Ehundategh/p/17792819.html

相关文章

  • [NOIP 2013提高组]货车运输 题解
    [NOIP2013提高组]货车运输题解前置知识Kruskal重构树(内含讲解)+任意一种LCA题目翻译\(n\)座城市,\(m\)条道路,\(q\)次询问,每次求两个点\(x,y\)之间所有路径的最小值的最大值。题目分析其实学了Kruskal重构树差不多看到这个题目就知道怎么写了。其实就是Kruskal重构树的板子,......
  • 问题解决
    pip源问题解决使用pip安装pytorch出现WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))报错使用换源解决问题pip3configlistpip3configsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/pip3configlist国内......
  • 第四章苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    代码#include<stdio.h>#include<stdlib.h>#include<pthread.h>#defineN4intA[N][N],sum[N];void*func(voidarg){intj,row;pthread_ttid=pthread_self();row=(int)arg;printf("Thread%d[%lu]computessumofrow%d\n"......
  • Python打不开问题解决方案大全
    在使用Python进行编程开发的过程中,我们不可避免会遇到Python打不开的问题。这些问题可能是由于环境配置、包管理和依赖文件等问题所导致的,但不管是何种原因,我们都需要解决它们才能顺利地进行工作。本文将从多个方面为大家详细介绍Python打不开问题的解决方法。一、Python环境配......
  • Acwing393. 雇佣收银员 题解 差分约束
    题目链接:https://www.acwing.com/problem/content/description/395/解题思路:差分约束。为了方便起见,定义第\(i\)个时间段为\(i-1:00\)到\(i:00\)首先,为了方便开一个额外的点,令\(R_i\)对应为题目中的\(R(i+1)\),即\(R_i\)表示\(i-1:00\)到\(i:00\)这个时间段的最小需求......
  • AnyCAD程序无法启动的问题解决方法
    在某些电脑上会出现基于AnyCAD开发的程序无法启动的问题,如:System-ArgumentEcception:Pleasecheckthedependendes解决方法安装最新的VS运行时库,如VS2022:微软官方下载地址:x64:vc_redist.x64.exeSystem.AccessViolationException:"Attemptedtoreadorwriteprotectedmemor......
  • CF777题解
    分析先对每一列都做DP寻找极长单调不降区间,能够得到若干极长单调不降区间,只要询问的区间是这些区间的子区间,那么说明在这个区间内必有一列的这个区间是单调不降的。思考如何快速判断子区间。用\(f_{x}\)表示以\(x\)为所有左端点为\(x\)的区间的右端点最大值,那么对于......
  • ThinkPad OneLink+ Dock扩展坞 多屏幕 黑屏 问题解决
    我的机器是ThinkpadnewS2,扩展坞是ThinkPadOneLink+Dock,操作系统是win10原版。由于工作原因,把笔记本当台式机用。接了两台1920*1080的显示器。用了一段时间后,两台显示器中的其中一台显示器,黑屏,在win10的显示界面,应当有三台显示器,但实际只有两台。类似下图出现这个问题,毫无......
  • 'main' attribute cannot be used in a module that contains top-level code 问题解
    核心是@main注解在main.swift文件中,可以重新命名下参考资料https://stackoverflow.com/questions/73431031/swift-cli-app-main-attribute-cannot-be-used-in-a-module-that-contains-top-leve......
  • CF777A题解
    分析发现操作\(6\)次后就会回到初状态,于是将状态打表,将\(n\bmod6\)即可。代码#include<iostream>usingnamespacestd;constexprintMAXN(1000007);inta[6][3]={ {0,1,2}, {1,0,2}, {1,2,0}, {2,1,0}, {2,0,1}, {0,2,1}};intn,k;inli......