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 ...
随机推荐
- PHP扩展之Yaconf
这个是继鸟哥出品的yaf,yar 之后的又一个好用的工具. Yaconf配置管理工具 具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.htm ...
- dotnet core微服务框架Jimu ~ 基础网关
网关提供外部访问内部微服务的统一入口,基于分布式和服务治理等功能特点,外部不能绕过网关调用内部微服务(框架本身提供外部可以直接访问内部微服务的功能,这里不作详细说明),外部通过 http 协议请求网关 ...
- 多线程编程入门Thread_Task_async_await简单秒懂
` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- Sealos Devbox 云开发框架使用教程
用过 Sealos 云开发的同学,想必都很熟悉函数式编程,喜欢 Sealos 云开发的那种完全不用关心路由,开发快,上线快,调试快,越用越简单越简单越用的感觉.它就像一个温柔的保姆,帮你打理好了所有的 ...
- python读取pdf
1. vscode 安装python插件 2. vscode 终端安装pdfminer.six , pdfplumber python -m pip install pdfminer.six pyth ...
- zz Spring 是一种反模式
Java 将会消亡 – Martin Vysny – 第一性原理思考 原文标题"Java 将会消亡", 我并不认可 Java 会消亡一说, 作者还处于 FP 亢奋期,而我已经从 F ...
- Java 基于接口的动态代理
UserDao接口 package com.pry.cn; public interface UserDao { public int add(int a,int b); public String ...
- 多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用
一.功能特点 组件同时集成了导出数据到csv.xls.pdf和打印数据. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便. 同时支持QTableView.QTab ...
- Qt音视频开发41-人脸识别嵌入式
一.前言 大概几年前搞过一套嵌入式linux上的人脸识别程序,当然人脸识别的核心算法并不是自己开发的,关于人脸识别算法这一块,虽然有众多的开源库可以用,甚至还可以用opencv搞算法训练深度学习之类的 ...
- Qt音视频开发14-mpv读取和控制
一.前言 用mpv来读取文件的信息,以及设置当前播放进度,音量.静音等,和当时vlc封装的功能一样,只不过vlc是通过调用函数接口去处理,而mpv是通过读取和设置属性来处理,vlc支持定时器或者线程中 ...