BZOJ3600:没有人的算术】的更多相关文章

题意:太难说了..手动去看吧反正不是权限题. 膜拜VFK大爷的神题! 其实一开始思路挺清楚的,如果我们能做到用一个实数去代表"数",这就是裸的动态区间最值查询. 关键是怎么用实数去表示.如果我们单纯的把两个数进行O(1)运算去得到一个实数,这样很轻松就会被卡掉,因为无论是longlong还是double都是有限度的.怎么做呢? 这里有一个技巧:我们维护一个重量平衡树,每个节点管辖一个区间,这个区间的中位数为这个点的权值,而它的左儿子管辖左半边,右儿子管辖右半边. 问题来了,这不是差不多…
题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当前节点是$[l,r]$,则左儿子是$[l,mid]$,右儿子是$[mid,r]$ 令$f[x]=(l[x]+r[x])*0.5$,则$f$比较大小则等价于序列中的元素比较大小 此时,用重量平衡树来实现这一过程,可以做到均摊$O(\log n)$修改,$O(1)$查询两个点之间的大小关系 本题中,考虑使用一棵平…
题目描述 过长--不想发图也不想发文字,所以就发链接吧-- 没有人的算术 题解 \(orz\)神题一枚 我们考虑如果插入的数不是数对,而是普通的数,这就是一道傻题了--直接线段树一顿乱上就可以了. 于是我们现在只需要解决一个问题--维护这些数的大小关系. 由于这些数具有有序性,我们可以将这些数的值重记为一个数,这样就可以无脑地比较了.并且,由于这些值的大小可能会随着插入而更改,所以要用一棵平衡树来维护. 那么问题来了,这个数取什么值比较好呢? 首先当然可以是排名,不过如果使用排名,每次访问值的时…
传送门 如果能给每个 \(pair\) 按照权值编号就好了 假设之前已经有了所有的权值的编号,现在考虑编号新的 \(pair\) 如果看过了陈立杰的论文的话,不难得到一个重量平衡树的做法 给树上每个子树一个实数权值区间 \([l,r]\),这个点权值为 \(mid=\frac{l+r}{2}\) 左子树 \([l,mid]\) 右子树 \([mid,r]\) 只需要选择一个树高 \(log\) 的树(treap/替罪羊树)使得满足精度要求即可 # include <bits/stdc++.h>…
题意: 题解: Orz vfleaking……真·神题 做法大概是先把题意中定义的“数”都赋一个实数权值,用平衡树来维护整个从大到小排序过的序列,再用线段树查询最值: 这样做为什么是对的?考虑插入一个数$x$,我们已经知道了$x_L$和$x_R$在序列中的位置,就可以直接每次$O(1)$比较权值大小来找到$x$应该插入的位置,这样子单次插入是$O(logn)$的: 再考虑赋值,可以把根节点的区间设为$(0,1)$,然后每个点的权值都赋为这个区间中点的值,向子树递归赋值即可:由于平衡树树高是$O(…
点此看题面 大致题意: 定义任意数对\(>0\),数对之间比大小先比第一位.后比第二位,一开始数列全为\(0\),要求你支持\(a_k=(a_x,a_y)\)和询问区间最大值所在位置两种操作. 化数对为实数 直接记录数对显然是不现实,也不可能的. 考虑到若数对\((a,b)<(c,d),(c,d)<(e,f)\),则\((a,b)\)必然小于\((e,f)\),即数对之间的比大小具有传递性. 那么我们可以考虑把每个数对按其大小对应成一个实数,而实数之间的比大小就非常方便了,直接用线段树维…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3600 已知 l 和 r 的排名,想快速知道 k 的排名.那么建一个 BIT ,用已知的排名做比较,走到一个位置,就知道自己的排名了. 但这样会让很多点的排名改变.如果用实数表示标号就可以方便地生成一个 “两个排名之间的排名” 而不影响其他点. BIT 的每个节点代表一个曾经出现过的序列里的点,有自己的实数标号和 ( l , r ) 的组成. 如果把实数标号不是记在 BIT 节点上而是记在序…
题目都是图片,就不给了,就给链接好了 由于bzoj比较慢,就先给[vjudge传送门] 有兴趣的可以去逛bzoj[bzoj传送门] 题目大意 有n个数a[1],a[2],...,a[n],它们开始都是0,现在有两种操作 1)C l r k,给a[k]赋值为(a[l], a[r]) 2)Q l r,找到a[l], a[l + 1], ..., a[r]中的最大值,并输出它的下标,如果有多个最大值,则输出最小的那一个. 对于数对的比较,在题目中是这么定义的 对于任意x, y,若x = 0, y ≠…
Description Solution 我们可以给每一个数钦定一个权值 , 这样就可以 \(O(1)\) 比较大小了. 考虑怎么确定权值: 用平衡树来维护 , 我们假设根节点管辖 \([1,2^{60}]\) 的数 , 根节点的右儿子都比根节点权值大 , 左儿子权值都都比根节点小 左儿子管辖 \([1,2^{59}-1]\) , 右儿子管辖 \([2^{59}+1,2^{60}]\) 这样分下去 , 但是插入可能会导致不平衡 , 使得深度过大, 不断除以 \(2\) 最后变成小数 , 导致精度…
题目传送门 题意 具体的自己去上面看吧...反正不是权限题. 简单来说,就是定义了一类新的数,每个数是0或者为 \((x_L, x_R)\) ,同时定义比较大小的方式为:非零数大于零,否则按字典序比较(先比较 \(x_L\) ,相等就比较 \(x_R\) ,递归定义) . 一开始序列A中元素都是0,然后支持两种操作: C l r k: 将A[k]赋值为(A[l],A[r]). Q l r: 询问A[l],A[l+1]...A[r]中的最大值的编号,若有多个最大值,输出最小的编号. 简要做法 官方…