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;