AtCoder [ABC351E] Jump Distance Sum 题解 [ 绿 ] [ 数学 ]


场上差点就想出来了,就差一个旋转坐标轴了。
初步分析
首先来看如何判断两个点能不能走到,这可以看成下面的一张网格图,相同颜色的格子相互连通。
因此根据瞪眼法,可以把这些格子分为 $ (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\) 分别拆开然后再来求和。这个操作要在两组之间分别进行。
公式为 :
\]
那么在 \(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 题解 [ 绿 ] [ 数学 ]的更多相关文章
- 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 ...
- Codeforces Round #336 (Div. 2)B. Hamming Distance Sum 前缀和
B. Hamming Distance Sum 题目连接: http://www.codeforces.com/contest/608/problem/A Description Genos need ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- Codeforces 608B. Hamming Distance Sum 模拟
B. Hamming Distance Sum time limit per test: 2 seconds memory limit per test:256 megabytes input: st ...
- Ural 1248 Sequence Sum 题解
目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...
- AtCoder Grand Contest 021完整题解
提示:如果公式挂了请多刷新几次,MathJex的公式渲染速度并不是那么理想. 总的来说,还是自己太弱了啊.只做了T1,还WA了两发.今天还有一场CodeForces,晚上0点qwq... 题解还是要好 ...
- AtCoder Grand Contest 039 简要题解
从这里开始 比赛目录 Problem A Connection and Disconnection 简单讨论即可. Code #include <bits/stdc++.h> using ...
- 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 ...
- 关于前缀和,A - Hamming Distance Sum
前缀和思想 Genos needs your help. He was asked to solve the following programming problem by Saitama: The ...
- Atcoder Tenka1 Programmer Contest 2019 题解
link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...
随机推荐
- golang之http请求库go-resty
github: https://github.com/go-resty/resty go-resty 特性# go-resty 有很多特性: 发起 GET, POST, PUT, DELETE, HE ...
- 从Delphi到Lazarus——安装最新版的Lazarus
0.前言 在这篇文章里将会介绍以下内容: 下载最新版的Lazarus安装程序 安装Lazarus 安装整合IDE界面的软件包 编译运行你的第一个测试程序 结束语 1.下载最新版的Lazarus安装程序 ...
- git gitignore文件不生效
配置了 .gitigore 文件不生效,是刚开始将那些过滤的文件加到了版本控制.后续增加的,没有进入到版本控制 解决办法就是从版本控制移除,重新更新下gitignore文件 执行以下命令: 根据情况自 ...
- .NET Aspire 外部参数 (External parameters)
.NET Aspire 外部参数 (External parameters) https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/ ...
- GraphQL Part III: 依赖注入
在 SOLID 设计原则中,D 表示依赖反转原则 高层组件不应该依赖于底层组件,双方应该基于抽象 抽象不应该依赖于实现,实现应该依赖于抽象 使用 new 操作符来创建对象实例会导致不同组件之间的紧耦合 ...
- 中电资讯-乘风破浪数字经济,银行如何Hold数据?
近期各类规划密集发布人行金融科技发展规划发布 金融标准化"十四五"规划发布 "十四五"信息化规划发布 -- 和数据应用有关的各项政策密集出炉 数字经济发展中如何 ...
- 【NAS】Docker Gitea+SakuraFrp+绿联DPX4800标 搭建私有代码托管平台
本文主要分享 Gitea的一些设置,和Https的实现. Gitea的一些设置 映射 网络 HTTPS的实现 先准备好一个域名,建议准备一个1Panel 创建一个AC账户然后点击申请证书,手动解析. ...
- kubeadm卸载清空k8s环境
#!/bin/bash kubeadm reset -f modprobe -r ipip lsmod rm -rf ~/.kube/ rm -rf /etc/kubernetes/ rm -rf / ...
- spring boot 配置多个DispatcherServlet
传统的web项目,只需要在web.xml里配置多个即可,并且支持多个url-pattern 在spring boot中,我们默认无需配置,系统会自动装配一个,感兴趣的可以看下源码 org.spring ...
- ScheduleServerRunnable2
package com.xx.schedule.thrift.server; import com.xx.schedule.thrift.service.ScheduleService; import ...