随笔分类 -  1树状数组

摘要:考虑计算每个位置的数作为最小值时有多少种情况 方便起见,以位置为第二关键字比较大小,这样就不会出现“相同的”数 可以方便地计算出以i位置为最小值的区间端点的可行位置:[A,i],[i,B] 这是我选的一个区间,那么另一个区间会有两种情况:在[A,B]的范围内或者不在 不妨只考虑另一个区间在i这个区间 阅读全文
posted @ 2018-12-04 19:49 Ressed 阅读(213) 评论(0) 推荐(0)
摘要:首先整体二分,问题变成是否存在经过一个点的满足条件的路径 那么我对于每个路径(a,b,lca),在树状数组的dfn[a]++,dfn[b]++,dfn[lca]--,dfn[fa[lca]--] 然后直接查那个点的子树和就行了 阅读全文
posted @ 2018-12-01 19:01 Ressed 阅读(178) 评论(0) 推荐(0)
摘要:考虑整体二分,问题就变成了每个(水果)路径有多少个满足条件(权值)的(盘子)子路径 考虑一个盘子(a,b)表示两端点(不妨设dfn[a]<dfn[b]),那么他能接到的水果(u,v)一定满足(不妨设dfn[u]<dfn[v]): 1.如果a是b的祖先,则u在(a的在(b,a)链上的孩子)这个子树外, 阅读全文
posted @ 2018-12-01 18:42 Ressed 阅读(184) 评论(0) 推荐(0)
摘要:设f[i]是以i位置为结尾的最长满足条件子序列的长度 那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置能变化出来的最大值或最小值 这个东西用一个cdq来做 具体来说,先做左半区间,然后左边按max排序,右边按a排序,把左 阅读全文
posted @ 2018-11-21 19:35 Ressed 阅读(348) 评论(0) 推荐(0)
摘要:逆序对数=0的时候,这个数列是有序的 然后交换相邻的,看哪个比较大,逆序对数会加1或减1 Jeff用的是最优策略所以他肯定让逆序对数-1 设f[i]表示Jeff操作前,逆序对数为i,最终的期望次数 那就有$f[i]=0.5f[i-2]+0.5f[i]+2$ 以及$f[1]=1,f[0]=0$ 可以得 阅读全文
posted @ 2018-11-19 21:28 Ressed 阅读(210) 评论(0) 推荐(0)
摘要:注意到,所有的-1应该是一个不降的序列,否则不会更优那就先求出来不是-1的的逆序对个数,然后设f[i][j]表示第i个-1放成j的前i个-1带来的最小逆序对数量这个可以树状数组来求 阅读全文
posted @ 2018-10-29 21:07 Ressed 阅读(216) 评论(0) 推荐(0)
摘要:用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱、能买多少糖,拿T除一除,减一减,再去跑下一圈 每个位置只会被删一次,所以复杂度是$O(nlog^2n 阅读全文
posted @ 2018-10-27 22:23 Ressed 阅读(242) 评论(0) 推荐(0)
摘要:首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 阅读全文
posted @ 2018-10-18 16:47 Ressed 阅读(823) 评论(0) 推荐(0)
摘要:带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话),空间可能会被卡,但实际上点数不用开到特别大,N*200也能过 阅读全文
posted @ 2018-10-15 21:21 Ressed 阅读(211) 评论(0) 推荐(1)
摘要:无修改、询问区间种类数的问题可以很容易地用树状数组解决 我们先给询问按右端点排序,然后推着做,每次让a[i]++,表示i处新增了一个种类 但是这样会和前面的有重复,我们只要记下每个种类上次在哪里出现过,当这次又出现了,把前面的那次减掉就可以了 每次处理完之后,就可以计算所有右端点为i的区间的答案,就 阅读全文
posted @ 2018-09-20 16:47 Ressed 阅读(110) 评论(0) 推荐(0)
摘要:我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn)$求出来 然后我们让g[i]是长度为i的不降子序列的个数,答案就是$\sum{g[i]*(N-i)!-g[i+1 阅读全文
posted @ 2018-09-18 09:00 Ressed 阅读(175) 评论(0) 推荐(0)
摘要:由于是一个二次函数的关系,所以易证应该尽量让两组的顺序相同 然后就离散化乱搞几发,最后就变成了求逆序对的数量了 阅读全文
posted @ 2018-09-13 23:09 Ressed 阅读(155) 评论(0) 推荐(0)
摘要:用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了 阅读全文
posted @ 2018-09-13 23:06 Ressed 阅读(197) 评论(0) 推荐(0)
摘要:先膜黑科技讲义 - Magolor orz 基础 设lowbit(x)表示的是把x的二进制只留下最低一位的1,然后lowbit(x)=x&(-x) (我也不知道为什么) 设c[x]表示从i往前一共lowbit(x)个数的和,那么x-lowbit(x)就是c[x]表示的范围的前一个数。 然后可以得到c 阅读全文
posted @ 2018-08-25 22:20 Ressed 阅读(238) 评论(0) 推荐(0)
摘要:求三维偏序 设三维为a,b,c。先对a排序,这样i的偏序就只能<i。 然而排序的时候需要三个维度都判断一遍,最后还要去重,不然会出现实际应该记答案的数出现在它后面的情况。 (排序用的函数里不要写类似于<=之类的东西啊..会出奇奇怪怪的问题的(RE)) 然后分治来做,我们在做区间[l,r]的时候,先去 阅读全文
posted @ 2018-08-25 11:19 Ressed 阅读(240) 评论(0) 推荐(0)