\[\huge 近日多做数据结构题,或恐后再读不能醒悟,或记其思路,或骂出题人,或不想刷题,虽有此篇。
\]
\[\]
\[\]
\[\]
\[\]

T1 距离

首先这题部分分很多,直接 $ O (n^2) $ 枚举点对,在树上差分即可获得 70 分。

那么正解几乎和部分分就没什么关系了。

首先看到

\[ans_u = \sum_{x ∈ subtree_u} \sum_{y ∈ subtree_u} {\min{ (\vert a_x - a_y \vert , \vert b_x - b_y \vert ) }}
\]

中带了一个 $ min $ 的操作,这让我们很不好用数据结构来维护,所以这个时候就得转化题意。

\[a+b = \min { (a,b) } + \max { (a,b) }
\]

这个式子是显而易见的,那么通过这个式子我们就可以将 $ \min $ 操作转换为 $ \max $ 操作和简单求和操作。

但是我们转了个dan啊,取 $ min $ 和 取 $ max $ 不是一样难以维护吗。

你说得对,但是,取 $ max $ 操作还可以再次进行转换。

在原本问题中,一个特征值为 $ a_i , b_i $ 的点,可以映射到平面直角坐标系上的一个点 $ (a_i,b_i) $ ,那么两个点 $ (a_i,b_i) $ 和 $ (a_j,b_j) $ 之间的贡献就是 $ \min{(\vert a_i - a_j \vert , \vert b_i - b_j \vert)} $ ,也就是 $ \vert {a_i - a_j} \vert + \vert {b_i - b_j} \vert - \max{(\vert a_i - a_j \vert , \vert b_i - b_j \vert)} $ 。

那么 $ \max{(\vert a_i - a_j \vert , \vert b_i - b_j \vert)} $ 就是 切比雪夫距离

学习切比雪夫距离可看这篇博客

然后人类(反正不是我)发现 切比雪夫距离可以转化为曼哈顿距离 ,也就意味着可以将 取 $ max $ 操作转化为 绝对值求和操作,那么整道题就可以转化为 4个绝对值求和操作 。

怎么转呢?

我们通过图像来看,这是平面直角坐标系上所有与原点的切比雪夫距离为 1 的点:

一个边长为 2 的正方形的四条边。

然后我们在看看平面直角坐标系上所有与原点的曼哈顿距离为 1 的点:

一个边长为 $ \sqrt 2 $ 的正方形的四条边。

既然都是正方形,那么我给他转一下,然后再将边长乘上 $ \frac{\sqrt{2}}{2} $ 即可。

按理来说矩阵就是用来将一个坐标系旋转的,但是我根本不会好吧。

而且因为这是二维的,我们可以用虚数导一下。

$ x + y i $ 表示点 $ (x,y) $ ,一个虚数 乘上一个 虚数 的含义就是:两者的模长相乘,辐角主值相加。

所以将一个二维点进行旋转可以用虚数来导。那么将 $ (x,y) $ 逆时针旋转 45 °,再乘以 $ \frac{\sqrt{2}}{2} $ ,就相当于 乘上 $ \frac{1}{2} + \frac{1}{2} i $ 。点 $ (x,y) $ 也就变成了 $ (\frac{x-y}{2} , \frac{x+y}{2} ) $ 。

当然你旋转 45°、135°、-45°、-135° 都可以,一般会把 $ (x,y) $ 转化为 $ (\frac{x+y}{2} , \frac{x-y}{2} ) $。

接下来呢,设 $ a1_i = \frac{a_i + b_i}{2} , b1_i = \frac{a_i - b_i}{2} $,整道题都转化为了一个式子:

\[ans_u = \sum_{x ∈ subtree} \sum_{y ∈ subtree} \vert a_i - a_j \vert + \vert b_i - b_j \vert - \vert a1_i - a1_j \vert - \vert b1_i - b1_j \vert
\]

也就是维护 四个 绝对值求和。

然后这玩意可以分治计算,具体来说,对于 $ ans[1,n] $ (此处为值域)来说,可以分为两点都在中点的同一侧,和两点在中点的异侧,即:

\[ans[1,n] = ans[1,mid] + ans[mid+1][n] + cnt[1,mid] \times sum[mid+1][n] - cnt[mid+1][n] \times sum[1,mid]
\]

直接用线段树维护即可,合并时直接合并,不过需要改写 $ push_up $ 函数。

时间复杂度 $ O (nlogn) $ ,但是常数巨大。

听wkh讲可以学习一下 $ FHQ treap $ 的有交集合并,对于这道题也是 $ O (n log n) $ 的,但是为什么他是最优解啊。

\[END \ \ \ OF \ \ \ T1
\]
\[\]
\[\]
\[\]

G-数据结构-G的更多相关文章

  1. MySQL 中,\g和\G的作用

    MySQL 中,\g和\G的作用: \g 的作用是 go (\g) Send command to mysql server. \G 的作用是将查询到的结果,每行显示一个字段和字段值,方便查看 ego ...

  2. Sed命令n,N,d,D,p,P,h,H,g,G,x解析3

    摘自:https://blog.csdn.net/WMSOK/article/details/78463199 Sed命令n,N,d,D,p,P,h,H,g,G,x解析 2017年11月06日 23: ...

  3. sed命令n,N,d,D,p,P,h,H,g,G,x解析2

    摘自: https://blog.csdn.net/xiexingshishu/article/details/50514132 sed命令n,N,d,D,p,P,h,H,g,G,x解析 2016年0 ...

  4. xtu数据结构 G. Count the Colors

    G. Count the Colors Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Jav ...

  5. ubuntu 出现g++ : Depends: g++-4.8 (>= 4.8.2-5~) but it is not going to be installed

    Ubuntu 你可以安装搜狗输入法也可以使用sunpingyin,看个人爱好. 唯一要注意的是,不能把系统的更新关了,否则会出现一大堆的问题,连g++都无法安装. 在设置里面: 我以前有一个很不好的习 ...

  6. 【转】sed命令n,N,d,D,p,P,h,H,g,G,x解析

    1. sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2. 为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间 ...

  7. MySQl中的\g和\G

    1. \g 在MySQL的sql语句后加上\g,效果等同于加上定界符,一般默认的定界符是分号; 2. \G 在MySQL的sql语句后加上\G,表示将查询结果进行按列打印,可以使每个字段打印到单独的行 ...

  8. sed命令n,N,d,D,p,P,h,H,g,G,x解析

    1.sed执行模板=sed '模式{命令1;命令2}'即逐行读入模式空间,执行命令,最后输出打印出来2.为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\ ...

  9. MySQL - \g 和 \G用法与区别

    [1]DOS环境下 ① \g 可同时(单独)使用\g; 其作用等效于分号—’:’ : ② \G 可同时(单独)使用\G;; /G 的作用是将查到的结构旋转90度变成纵向:

  10. MySQL中\g和\G的作用

    \g的作用和MySQL中的分号”;"是一样: \G的作用是讲查找到的内容结构旋转90度,变成纵向结构: 下面举例说明,查找数据库中的存在的存储过程状态: SHOW PROCEDURE STA ...

随机推荐

  1. 【Layui】02 图标 Icon

    官网下载地址: https://www.layui.com/ 学习参考: https://www.bilibili.com/video/BV1ct411n7SN [Layui的文件结构] 我们只需要这 ...

  2. 位段 -- 内存布局详解C语言

    目录 位段的介绍 位段使用示例: 位段的内存分配 Example 内存分配解析: ## 位段 位段的介绍 位段(二进制位):就是按位存储 位段(bit-field)是C语言中的一种特殊数据类型,它允许 ...

  3. MindSpore 框架的官方预训练模型的加载 —— MindSpore / hub 的安装

    MindSpore计算框架提供了一个官方版本的预训练模型存储库,或者叫做官方版本的预训练模型中心库,那就是 MindSpore / hub . 首先我们需要明确概念: 第一个就是 mindspore_ ...

  4. 如何利用HMMER鉴定基因家族成员

    通常我们用的都是通过blast比对来确定我们需要的家族成员,首先是比对序列,再次是需要目标物种的蛋白序列,来进行比对,通常比对的时候我们都需要设定e-value值.今天我们来学习一下利用HMMER来鉴 ...

  5. MFC制作带界面的DLL库

    ## MFC如何创建一个带界面的DLL(动态链接库) 1.创建项目 打开VS,文件->新建->项目: 点击确定之后弹出来的界面,点击下一步->选择"使用共享MFC DLL的 ...

  6. 面试必问之redis

    这里是我作为10年面试经验总结的面试中必问问题 问题一 简单介绍下redis redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于M ...

  7. ibatis执行存储过程,java.lang.ArrayIndexOutOfBoundsException: 0

    在项目开发中遇到一个问题,ibatis执行存储过程时报错 <procedure id="insertStatisticsResult_settle" parameterCla ...

  8. Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程

    Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程 Xorbits Inference (Xinference) 是一个开源平台,用 ...

  9. IDEA中try/catch快捷键

    Ctrl + Alt + t

  10. RedisTemplate常用方法

    RedisTemplate常用方法 一.Redis常用的数据类型: String Hash List Set zSet Sorted set 二.RedisTemplate 常用 API 1. Str ...