随笔分类 - 树状数组
摘要:是不是快一年没写代码了啊?省选送分题现在得做一年。有没有学上先不管了。 容易发现总能量计算方式是两队被选出的参赛者各自能量和的min。显然随场地温度升高,冰队能量和单增,火队能量和单减,在两者最接近时总能量应最大。那么对冰队<=火队和冰队>=火队分别找到最大总能量及对应温度即可,可以二分+树状数组处
阅读全文
摘要:每个时刻都形成若干段满足段内任意两点可达。将其视为若干正方形。则查询相当于求历史上某点被正方形包含的时刻数量。并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就是裸的三维偏序,cdq分治+树状数组即可。
阅读全文
摘要:单个询问二分答案即可,多组询问直接整体二分再二维BIT。注意保证复杂度。
阅读全文
摘要:建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数。显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉。事实上直接树上差分,按dfs序排序后lca处-1,树状数组维护子树和即可。 又一次写了cmp后没放进sort,心态爆炸。
阅读全文
摘要:设f[i][j]为前i个划成j段的最小代价,枚举上个划分点转移。容易想到这个dp有决策单调性,感性证明一下比较显然。如果用单调栈维护决策就不太能快速的求出逆序对个数了,改为使用分治,移动端点时树状数组维护即可,类似莫队的每次都在原有基础上更新。注意更新时先加再减。感觉复杂度非常玄学丝毫不能看出为啥只
阅读全文
摘要:二分答案后得到每个位置需要被加的次数。考虑贪心。从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆。看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现区间覆盖。
阅读全文
摘要:对每个权值分别考虑。则只有单点加路径求和的操作。树上差分转化为求到根的路径和,子树加即可。再差分后bit即可。注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了。
阅读全文
摘要:化为前缀和相减。考虑每一位的贡献。则需要快速查询之前有几个数和当前数的差在第k位上为1。显然其与更高位是无关的。于是用BIT维护后k位的数的出现次数,瞎算一算即可。
阅读全文
摘要:相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对。也即要将原序列划分成两个单增序列。由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉。 这个时候有两种显然的暴力。 将点集划分成两部分使内部无边显然就是二分图,于是第一种暴力是在逆序对之间连边,答案
阅读全文
摘要:对节点按编号分块。设f[i][j]为修改j号点对第i块的影响,计算f[i][]时dfs一遍即可。记录每一整块的sum。修改时对每一块直接更新sum,同时用dfs序上的树状数组维护子树和。查询时累加整块区间的sum,剩余部分bit上暴力查询。分析一下复杂度。设块大小为k,计算f数组的复杂度为O(n2/
阅读全文
摘要:首先求出每个女性接受某个男性的概率。这个概率显然是一个无穷等比数列求和。 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可。 需要long double。
阅读全文
摘要:即滋磁单点修改,询问路径上小于某数的值有多少个。暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美。 开始觉得可以cdq,然而就变成log^3了。冷静一下感觉简直是个弱智,修改本身就是单调的,只要对询问离线即可。树剖+BIT即可维护。
阅读全文
摘要:首先dp出长度为i的不下降子序列个数,显然这可以树状数组做到O(n2logn)。 考虑最后剩下的序列是什么,如果不管是否合法只是将序列删至只剩i个数,那么方案数显然是f[i]*(n-i)!。如果不合法,说明这个序列是由一个长度为i+1的非降序列删除一个数得来的,所以将其减去f[i+1]*(i+1)*
阅读全文
摘要:显然相当于使序列变成单峰。给原序列每个数按位置标号,则要求重排后的序列原标号的逆序对数最少。考虑将数从大到小放进新序列,那么贪心的考虑放在左边还是右边即可,因为更小的数一定会在其两侧,与它自身放在哪无关。对于相同的数,一定可以将其安排至之间无逆序对,特判一下。
阅读全文
摘要:如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了。可以想到用分治来制造单调性。 按横坐标排序,每次考虑跨过分治中心的矩形。考虑右边的每个点能与左边的哪些点构成矩形。首先这受到右边点的限制,对于每个点用set求出这个范围。然后对所有点按纵坐标从大到小排序,维
阅读全文
摘要:可以发现每次都对后缀+1是不会劣的。考虑dp:设f[i][j]为前i个数一共+1了j次时包含第i个数的LIS长度。则f[i][j]=max(f[i][j-1],f[k][l]+1) (k<i,l<=j,a[i]+j>=a[k]+l)。容易发现这里是二维偏序,相当于查询(j,a[i]+j)左下部分的最
阅读全文
摘要:二维的dp非常显然,但这也没有什么优化的余地了。 注意到最后的方案中只有产生贡献的位置是有用的,剩下的部分可以在该范围内任意选取。 所以我们考虑设f[i]为i号位最后产生贡献的答案,则f[i]=max{f[j]+1} (i-j>=a[i]-a[j],a[i]>a[j])。 观察这个限制,即为i-a[
阅读全文
摘要:这个做法非常显然。 当然也可以分块。预处理出块内答案和两块间答案,块外主席树查询。
阅读全文
摘要:容易发现如果求出最后的序列,只要算一下LIS就好了。序列用平衡树随便搞一下,这里种一棵splay。
阅读全文
摘要:如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了。 考虑离线。按左端点从小到大排序,不断移动左端点并更新第二次出现的位置。
阅读全文

浙公网安备 33010602011771号