BZOJ2989 数列(二进制分组)】的更多相关文章

[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]|. 2种操作(k都是正整数): 1.Modify x k:将第x个数的值修改为k. 2.Query x k:询问有几个i满足graze(x,i)<=k.因为可持久化数据结构的流行,询问仅要考虑当前数列,还要考虑任意历史版本,即统计任意位置上出现过的任意数值与当前的a[x]的graze值<=k…
题意的转化挺巧妙的 可以联想到曼哈顿距离! 并且,所谓的修改还要查询历史版本,并且修改之间不动只算一次,不就是给平面上加一个点吗? 看成(x,a[x])的点 就是一个菱形区域 转切比雪夫距离,变成矩形区域 所以 平面单点加,矩形查询和 1.cdq分治 2.树套树(离散化都不用) 3.二进制分组+主席树 这里,大炮打蚊子,用二进制分组来写 加入的点按操作二进制分组,每个组用主席树维护这个平面,查询在logn上查询,合并暴力重构,256MB又没有删除,所以重构完了把原来的树垃圾回收 注意: 主席树垃…
[BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]|. 2种操作(k都是正整数): 1.Modify x k:将第x个数的值修改为k. 2.Query x k:询问有几个i满足graze(x,i)<=k.因为可持久化数据结构的流行,询问不仅要考虑当前数列,还要 考虑任意历史版本,即统计任意位置上出…
这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组. 它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了一个后就变成了24(16+8)个,遇到查询就在每个组内查询,再加起来就好了. #include <cstdio> #include <vector> #include <algorithm> using namespace std; #define M ((l+r)>…
传送门 二进制分组入门题. 主席树写错调题2h+2h+2h+体验极差. 题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk. 思路:题目要求的是对于一个斜着的正方形的查询. 我们考虑转切比雪夫距离转成正常的正方形. 然后就变成了一个动态的二维数点问题. 这个时候已经可以上cdqcdqcdq分治+扫描线或者树套树切题啦. 然而还有一种叫做二进制分组的方法可以支持强制在线的操作. 我们考虑将修改分组,例如对于前19=16+2+119=16+2+1…
UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\)的信息.由于每次加入一个操作只会加入两个断点,所以维护数列上每个线段的二元组\((a,b)\). 当一个时间块被填满之后就把两边的二元组归并上来,复杂度是\(O(断点个数)\). 由于一个操作只会加2个断点,一个断点只会被往上合并\(O(\log n)\)次,所以复杂度非常正确. 询问的时候在线段树…
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standard input output:standard output You should process m queries over a set D of strings. Each query is one of three kinds: Add a string s to the set D. I…
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接计算. 强制在线的话,一般而言,分治在线就弄成二进制分组.把所有修改操作进行二进制分组,每次新加入一个修改操作的时候考虑和前面其他的操作合并,提前构出来线段树,按照次序插入.如果一个节点的左右儿子都填满了修改操作的话,那么把它的两个儿子的值进行合并.然而我们发现并不可能每个节点维护一棵线段树来表示所…
ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string s to the set D. It is guaranteed that the string s was not added before. Delete a string s from the set D. It is guaranteed that the string s is in th…
题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法是对于每个点求一遍最短路,这样一共要跑n次最短路,时间复杂度\(O(nmlogm)\). 考虑两个点集\(S1\)和\(S2\)之间的最短路,我们可以跑一次最短路求出来. 具体可以新建虚拟源点\(s\)和虚拟汇点\(t\),\(s\)和\(S1\)的每个点之间连一条零边,\(t\)同理. 那么这一次最短路就相…