首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
hdu5737
】的更多相关文章
hdu5737(2016多校联赛第2场D)
题意:给2组数据a和b数组,每次有2种操作:(+,l,r,x)把a数组第l个到第r个元素全置为x,(?,l,r)查询[l,r]之间哪些位置满足a[i]>=b[i](i>=l && i<=r)并把这些位置的数量统计 一直想很久,没想到什么有效的方案,直到看到题解才明白过来,原来线段树套平衡树还有这种情况:里面其实不是平衡树,只是有序表. 然后这题就转换为区间查找数对应排名 由于此题不用对2个数组都修改,其中1个b树可作为固定的线段树套有序表以节省时间,另外1个表a树则单纯使…
HDU5737 : Differencia
注意到$b$不变,考虑用归并树来维护这个$b$序列,对于每个节点有序地维护$b$,同时在归并的时候预处理出每个元素在左右儿子里的排名. 在归并树上额外维护区间内$a\geq b$的个数以及赋值标记. 那么在区间赋值的时候,只需要在根节点的$b$数组中做一个二分,然后往下通过预处理的名次数组转移即可,标记下放时也是如此,每次转移复杂度显然是$O(1)$. 时间复杂度$O((n+m)\log n)$. #include<cstdio> #include<algorithm> const…
hdu5737
首先思考一个朴素的做法 将b[]维护成一个线段树套有序表,每次修改a[]用线段树+lazy tag 并在线段树的子区间上在有序表中二分更新这段区间中a[i]>=b[i]的值,复杂度O(nlog^2) 有没有更优的做法? 考虑在一次修改操作中,查询的数是相同的,并且b[]这个有序表始终不变 因此在生成b[]的线段树套有序表过程中(其实就是归并排序的记录) 我们维护每个数在左右子区间中名次. 这样修改的时候我们只要对b[]排好序的整体做一次二分,找到b[m]<=x<b[m+1] 把修改成x当…