【原创】bzoj 4710 极光 未完成

本文介绍了一道复杂的算法题目,涉及数列操作、历史版本查询及曼哈顿距离计算。通过坐标系转换,将问题转化为在新坐标系中查询特定距离范围内的点数,最终使用CDQ算法解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

极光

题目描述

“若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她。对方表现出兴趣的话,那就慢慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简单的问题,她一定也答不上来。” ——《上古之魔书》
天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列a[i],远古之魔书上记载到:2个位置的graze值为两者位置差与数值差的和:
graze(x,y)=|x-y|+|a[x]-a[y]|。
要想破解天罚,就必须支持2种操作(k都是正整数):
Modify x k:将第x个数的值修改为k。
Query x k:询问有几个i满足graze(x,i)<=k。
由于从前的天罚被圣王lmc破解了,所以rhl改进了她的法术,询问不仅要考虑当前数列,还要考虑任意历史版本,即统计任意位置上出现过的任意数值与当前的a[x]的graze值<=k的对数。(某位置多次修改为同样的数值,按多次统计)

输入格式

第1行两个整数n,q。分别表示数列长度和操作数。
第2行n个正整数,代表初始数列。
第3~q+2行每行一个操作。

输出格式

对于每次询问操作,输出一个非负整数表示答案。

输入样例

3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1

输出样例

2
3
3

提示

在这里插入图片描述

分析

第一眼看过去以为它是可持久化的,就是询问某个历史版本,结果是询问所有历史版本。
所以modify操作 = = =加点……
那么题意就是modify加点,然后query查询对于某个点,图上与它的曼哈顿距离小于等于某个值的点的个数。

那么如果我们把坐标系翻转45°之后,这个题就变成了类似于简单题一样的板子题了。
那么怎么翻转呢?
在这里插入图片描述
如上图所示,设旋转之前的点的坐标为 ( x , y ) (x,y) (x,y),旋转之后的坐标为 ( x ′ , y ′ ) (x',y') (x,y)
那么我们可以很愉快的列出方程:
{ x = 2   x ′ + y y ′ = x ′ + 2   y \begin{cases} x=\sqrt{2} ~ x' +y\\ y'=x'+\sqrt{2}~y\\ \end{cases} {x=2  x+yy=x+2  y

于是愉快地解得
{ x ′ = x − y 2 y ′ = x + y 2 \begin{cases} x'=\frac{x-y}{\sqrt{2}}\\ y'=\frac{x+y}{\sqrt{2}} \end{cases} {x=2 xyy=2 x+y

那个 2 \sqrt{2} 2 让我们很不爽,于是我们把整个新坐标轴拉伸一下,每个点的横纵坐标都变为原来的 2 \sqrt{2} 2 倍,所以 x ′ = x − y   ,   y ′ = x + y x'=x-y~,~y'=x+y x=xy , y=x+y
而我们要在之前的坐标系里求它曼哈顿距离为k的(丑死了的橙色正方形)的区域内的这个正方形,因为坐标都 2 \sqrt{2} 2 了,所以就相当于在这个新坐标系里一个正正方方的,长度为 2 k 2k 2k的正方形了。

在这里插入图片描述
于是我们就可以快乐CDQ了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值