DAY1(线段树例题篇)

1.俄罗斯方块: 有n个正方形由无限高下降,告诉你左端坐标(1<=idx<=1e8)以及边长(1<=len<=1e6),下端遇到实体则停止下降,与其他正方形擦边则不停止

求每个方块下落后,整个左边的最高值是多少

1<=n<=1e6, 1<=len<=1e6, 左下标idx<=1e8;

如何处理 数据离散化?vector<int>b; +cal函数,+结构体存储正方体信息

如何处理正方形的下落遇到实体? 查询区间最值

如何处理擦边不停止? 规定左边为实,右边为虚;

up:取max

down 为重置

add: 为重置

s为查最值

2插花(线段树的二分)

俩类操作:

op1: 1 from flower 从 1位置开始,往后一直找空位置,直至找满flower 个空位置插满花停止,并打印第一个空瓶和最后一个空瓶;

op2 :将from 至to的花瓶拿走 

思路:若无放置花瓶,则为区间重置操作,若在已放置花瓶上,想快速查找右边界至哪才能放下花瓶,则需要线段树快速处理;利用线段树求和的功能,通过二分快速查找何时由aim个空位置;

up,search为求和

lazy和down为重置

int l=from,r=n;

while(l<r)

{

int mid=(l+r)/2;

if(r-l+1-s(1,l,r,1,n)>=m)r=mid;

else l=mid+1;

}// 快速查找 from 到哪可以插满花朵,但需进行判断是否能够插花

3, 区间修改但必须暴力处理(只能下发至叶节点)

   此时只要满足叶节点的处理次数有限,那么就可能可以实现最多logn *n * m 次修改操作

如 实现 1 区间求和, 2 区间元素取mod ,3 单点修改

由于一个元素取mod 必定下降一半大小, 那么节点最多修改logv 就会降到0;

只要维护区间max ,如果max 小于 mod 则return

单点修改会增加 logv*logn的修改次数,但有限

up:为求max,sum

s 为求 sum

addmod -》 一定要暴力下发至叶节点,将节点“势能”降低,利用区间max判断某区间是否势能为0可不进行修改;

addset : 暴力下发;

4: 

同 3 的暴力修改建立势能分析;

1 实现区间求和, 2 实现区间开根;

一个节点的开根次数有限,只要 维护区间max即可判断区间的势能是否为0;

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值