\[\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. Ubuntu18.04环境下 以太坊Geth的安装

    ubuntu18.04系统下安装: sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:eth ...

  2. 局域网中如何为Ubuntu20.04和window10共享文件

    如题,自己有两台电脑,一个安装的window10,一个安装的是Ubuntu20.04,两个电脑之间经常需要传文件,这个时候总是用U盘来回导文件就变得十分的不方便,于是就想到了设置网络共享. 本文的做法 ...

  3. python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列化到子进程后的inplace操作的问题

    参考: https://docs.python.org/zh-cn/3/library/multiprocessing.html cloudpickle -- Python分布式序列化的专用模块   ...

  4. 最佳实践:解读GaussDB(DWS) 统计信息自动收集方案

    摘要:现在商用优化器大多都是基于统计信息进行查询代价评估,因此统计信息是否实时且准确对查询影响很大,特别是分布式数据库场景.本文详细介绍GaussDB(DWS)如何实现了一种轻量.实时.准确的统计信息 ...

  5. 我是如何使用 vue2+element-ui 处理负责表单,避免单文件过大的问题

    引言 在工作中我经常需要处理一些复杂.动态表单,但是随着需求不断迭代,我们也许会发现曾经两三百行的.vue文件现在不知不觉到了两千行,三千行,甚至更多... 这对于一个需要长期维护的项目,无疑是增加了 ...

  6. 2023 ECF 游记

    录播 闭幕式 回顾 1.11 本来计划下午 vp 去年的 ecf,结果 zjj 忘记买票来投奔我了,所以鸽了.分块和莫队也没看 晚上收拾东西,完全装不下,应该早点寄走一些东西的 1.12 昨晚还想着别 ...

  7. 源码解析之为何要用ConcurrentHashMap

    为什么要用ConcurrentHashMap? ConcurrentHashMap是JUC包下的一个线程安全的HashMap类,我们都知道多线程的场景下要用ConcurrentHashMap来代替Ha ...

  8. Tomcat的配置文件中有哪些关键的配置项,它们分别有什么作用?

    Tomcat的配置文件主要包括server.xml和web.xml,它们位于Tomcat安装目录下的conf文件夹中.今天的内容重点介绍 server.xml 文件的配置,V 哥会结合一些业务场景来介 ...

  9. zblog免费插件分享前端代码支持一键复制

    zblog默认的代码文件在网页前端是不支持一键复制的,这会让访客复制长代码的时候不太方便,甚至有可能会出错,影响体验,下面分享一个非常简单的免费插件,安装之后,前端代码就能一键复制了. 插件使用方法: ...

  10. 使用 nuxi add 快速创建 Nuxt 应用组件

    title: 使用 nuxi add 快速创建 Nuxt 应用组件 date: 2024/8/28 updated: 2024/8/28 author: cmdragon excerpt: 通过使用 ...