原题



场上差点就想出来了,就差一个旋转坐标轴了。

初步分析

首先来看如何判断两个点能不能走到,这可以看成下面的一张网格图,相同颜色的格子相互连通。

因此根据瞪眼法,可以把这些格子分为 $ (x_i + y_i) \mod 2 =1$ 和 $ (x_i + y_i) \mod 2 =0$ 的两部分。

然后观察位置 \((x,y)\) 可以跳到 \((x+1,y+1) , (x+1,y-1) , (x-1,y+1) , (x-1,y-1)\) ,很容易发现只能斜向跳跃

所以就可以把整个坐标轴旋转一个 \(45°\) 来观察。

但这样还是不好看,根据等腰直角三角形的三边关系,我们可以再给坐标系的单位长度乘上 \(\sqrt 2\) 。

于是就得到了下图,有空白是因为乘了之后会出现空隙。

再简单用全等一线三等角模型证明一下,就可以导出坐标 \((x,y)\) 会变成 \((x+y,y-x)\) 。

注意:由于进行了扩倍的操作,所以需要将最后求得的答案 \(/2\) 。

具体实现

不难发现,任意两点间的跳跃步数可以转化为他们之间的曼哈顿距离

而曼哈顿距离有一个特点:可以将 \(x,y\) 拆开来进行计算。

于是,我们可以把一组点的 \(x\) 与 \(y\) 分别拆开然后再来求和。这个操作要在两组之间分别进行。

公式为 :

\[\sum_{i=1}^{N-1}{\sum_{j=i+1}^{N}{\text{dist}(P_i,P_j)}}=\sum_{i=1}^{N-1}{\sum_{j=i+1}^{N}{|x_i-x_j|}} + \sum_{i=1}^{N-1}{\sum_{j=i+1}^{N}{|y_i-y_j|}}
\]

那么在 \(O(n)\) 的时间里计算出这些就简单了。

先给 \(x\) 与 \(y\) 的数组简单排个序,以保证求得的答案为整数。

然后用一个 \(tmp\) 变量记录 \(\sum_{i=1}^{j-1}{(x_j-x_i)}\) ,每次统计到下一个 \(j\) 就把 \(tmp\) 加上 \(j*(x_j-x_{j-1})\) 。这个做法把它抽象成线段也许会更好理解。

对于 \(y\) 数组也同理,把结果加起来就行了。

还是挺需要思维的。

代码

#include <bits/stdc++.h>
using namespace std;
struct dot{
long long x,y;
}d;
vector<dot>vd1,vd2;
vector<long long>v11,v12,v21,v22;
int n;
long long ans=0;
int main()
{
cin>>n;
//点分组
for(int i=1;i<=n;i++)
{
cin>>d.x>>d.y;
if((d.x+d.y)%2==0)vd1.push_back(d);
else vd2.push_back(d);
}
//拆散并转换点坐标
for(int i=0;i<vd1.size();i++)
{
v11.push_back(vd1[i].x+vd1[i].y);
v12.push_back(vd1[i].y-vd1[i].x);
}
for(int i=0;i<vd2.size();i++)
{
v21.push_back(vd2[i].x+vd2[i].y);
v22.push_back(vd2[i].y-vd2[i].x);
}
//排序
sort(v11.begin(),v11.end());
sort(v12.begin(),v12.end());
sort(v21.begin(),v21.end());
sort(v22.begin(),v22.end());
//统计结果
long long tmp=0;
for(int i=1;i<v11.size();i++)
{
tmp+=i*(v11[i]-v11[i-1]);
ans+=tmp;
}
tmp=0;
for(int i=1;i<v12.size();i++)
{
tmp+=i*(v12[i]-v12[i-1]);
ans+=tmp;
}
tmp=0;
for(int i=1;i<v21.size();i++)
{
tmp+=i*(v21[i]-v21[i-1]);
ans+=tmp;
}
tmp=0;
for(int i=1;i<v22.size();i++)
{
tmp+=i*(v22[i]-v22[i-1]);
ans+=tmp;
}
cout<<ans/2;
return 0;
}

AtCoder [ABC351E] Jump Distance Sum 题解 [ 绿 ] [ 数学 ]的更多相关文章

  1. Codeforces Round #336 (Div. 2) B. Hamming Distance Sum 计算答案贡献+前缀和

    B. Hamming Distance Sum   Genos needs your help. He was asked to solve the following programming pro ...

  2. Codeforces Round #336 (Div. 2)B. Hamming Distance Sum 前缀和

    B. Hamming Distance Sum 题目连接: http://www.codeforces.com/contest/608/problem/A Description Genos need ...

  3. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  4. Codeforces 608B. Hamming Distance Sum 模拟

    B. Hamming Distance Sum time limit per test: 2 seconds memory limit per test:256 megabytes input: st ...

  5. Ural 1248 Sequence Sum 题解

    目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...

  6. AtCoder Grand Contest 021完整题解

    提示:如果公式挂了请多刷新几次,MathJex的公式渲染速度并不是那么理想. 总的来说,还是自己太弱了啊.只做了T1,还WA了两发.今天还有一场CodeForces,晚上0点qwq... 题解还是要好 ...

  7. AtCoder Grand Contest 039 简要题解

    从这里开始 比赛目录 Problem A Connection and Disconnection 简单讨论即可. Code #include <bits/stdc++.h> using ...

  8. Codeforces Educational Codeforces Round 5 E. Sum of Remainders 数学

    E. Sum of Remainders 题目连接: http://www.codeforces.com/contest/616/problem/E Description The only line ...

  9. 关于前缀和,A - Hamming Distance Sum

    前缀和思想 Genos needs your help. He was asked to solve the following programming problem by Saitama: The ...

  10. Atcoder Tenka1 Programmer Contest 2019 题解

    link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...

随机推荐

  1. elementUI 选择开始结束日期加限制

    需求是开始结束日期不得大于当前时间,当开始日期发生变化时,结束日期不得小于开始日期且不得大于当前日期 <el-form-item label="开始日期:"> < ...

  2. golang之验证器validator

    快速安装 使用之前,我们先要获取validator这个库. # 第一次安装使用如下命令 go get github.com/go-playground/validator/v10 # 项目中引入包 i ...

  3. 使用canal将数据同步到ROCKETMQ

    概述 我们需要将数据从MYSQL写入到rocketmq.实现步骤如下: 安装canal.admin 修改配置 server: port: 8849 spring: jackson: date-form ...

  4. 了解URLSearchParams对象

    URLSearchParams对象用于处理URL中查询字符串,即?之后的部分. 1.语法 其实例对象的用法和Set数据结构类似.实例对象本身是可遍历对象.但是不是遍历器. var paramsStri ...

  5. cas5开启Restful接口验证

    ​POM文件中加入rest依赖: <!-- Restful support --> <dependency> <groupId>org.apereo.cas< ...

  6. 02C++顺序结构(1)

    1.C++程序的样子 2.流 输出流 COUT<< 3.一个实例及解析 4.小结 头文件的解释 头文件是C++程序对其他程序的引用,就是让编译器的预处理器把这个输入输出流的标准文件iost ...

  7. 2024年1月Java项目开发指南9:密码加密存储

    提前声明: 你不会写这加密算法没关系啊,你会用就行. 要求就是:你可以不会写这个加密算法,但是你要知道加密流程,你要会用. @Service public class PasswordEncrypto ...

  8. Idea如何关闭单词拼写检查

    打开Intellij Idea,在代码中输入lisi或zhangsan单词,可见这两个单词下面出现了绿色波浪线,表明词库中找不到这两个单词 2 鼠标移到波浪线上,可以看到如下提示信息,点击[more] ...

  9. Qt/C++音视频开发80-ffmpeg实现srt推拉流/实时性非常好/音视频同步/支持格式众多

    一.前言 目前互联网上的视频直播有两种,一种是基于RTMP协议的直播,这种直播方式上行推流使用RTMP协议,下行播放使用RTMP,HTTP+FLV或者HLS,直播延时一般大于3秒,广泛应用秀场.游戏. ...

  10. 关于Qt几百个版本无法兼容的深度思考

    关于Qt众多版本(至少几百个)都不兼容的问题,在经过和Qt中国的林斌大神和其他大神(Qt非官方技术交流群)头脑风暴以后,最终得出以下的结论. Qt在二进制兼容这块,已经做了最大的努力,通过将各种代码细 ...