你已经建造了一条由编号从到的战壕组成的防线,每条战壕最初都是空的。士兵们正在等待你的命令,每个士兵都有一个喜欢的射击高度。
随着战斗的进行,以下两个事件可能会发生。
- 一个拥有首选射击高度的士兵被派去驻守一个空的战壕。
- 一个有高度的敌人被发现,只有驻守在编号在和之间的战壕里的士兵可以射杀这个敌人。为了提高命中率,从而节省子弹,有必要选择一个首选射击高度尽可能接近敌人高度的士兵来射击敌人。你需要知道所选士兵的首选射击高度和敌人的高度之间的差异。
非常妙的思路
分别将修改操作和询问操作离线,然后分别按照右端点排序。
然后以高度 h h h为下标建立权值线段树,然后将“最接近”转化为两次线段树上二分:求左侧最右和右侧最左,然后取差值最小值即可。
考虑如何检查合法性:由于在权值线段树上丢失了区间信息,因此二分时要检查合法性:我们对每个节点记录两个值:位置 x x x和时间戳 i d id id。
那么对于任意两个节点状态,当时间戳 i d 1 > i d 2 id_1>id_2 id1>id2且 x 1 < x 2 x_1 < x_2 x1 = x l >= x l>=x且 i d ′ < i d id' < id id′= INF) res = min(res, queryl(rson, L, R, val, pos)); return res; } int queryr(int rt, int l ,int r, int L, int R, int val, int pos){ if(l > R || r = L && r > 1, res = -1; if(res
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?