
树状数组
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj3289 Mato的文件管理(树状数组求逆序对+莫队+离散化)
首先明确,求交换次数最小其实就是求逆序对的个数。可以用树状数组方便地进行求解。然后题目没说文件大小的范围,我们就赶紧怕怕的采取了离散化。我们还发现这题可以O(logn)的由[l,r]=>[l-1,r]等等。。所以,莫队,就是你啦!具体细节见代码。#include #include #include #include #include using namespace std;#def原创 2017-07-19 16:41:11 · 428 阅读 · 0 评论 -
CF869E The Untended Antiquity(二维数状数组+差分+hash)
考虑什么情况会不可达,当覆盖两点的最小矩形不同时,一定不可达。因此我们需要快速的知道覆盖一个点的最小矩形是哪个。我们考虑每次把一个矩形染色,那么复杂度是不可接受的。联想到我们一维做区间加法,单点查询时,可以使用差分+前缀和的方法解决。我们此时同样可以使用差分+前缀和的思想。只不过是二维的。给(x1,y1,x2,y2)的矩阵加x,我们可以这样做:(x1,y1)+x,(x1,y2+1)-x,(x2+1,原创 2017-10-18 17:32:24 · 519 阅读 · 0 评论 -
bzoj3881 [Coci2015]Divljak(fail树+树链的并+BIT)
一开始给定模式串集合S,不断向文本串集合T添加字符串,多次询问T中有多少个串包含模式串Si。我们首先把S集合的串用ACAM建出fail树,然后每次加入新串时我们就去ACAM上跑一遍,把到达的节点记下来。因为对每个串只贡献一次,所以这一次的贡献就是这若干个节点到根的若干条链的并。怎么求链的并呢?将所有节点按照DFS序排序 每个点到根的路径上的所有节点权值+1 相邻两个点的LCA到根的路径上的所有节原创 2018-03-23 16:13:31 · 538 阅读 · 0 评论 -
bzoj5186 [Usaco2018 Jan]Cow at Large(树+dfs序+分块+BIT/点分治)
首先处理出数组mn[x],表示x到离他最近的叶子的距离。如果给定起始位置u,我们以u为根,处理出dis[x]表示x到u的距离,则节点x对答案有贡献当且仅当mn[x]<=dis[x]&&mn[fa[x]]> dis[fa[x]]。我们发现所有满足mn[x]<=dis[x]的点x构成的集合S就是由若干颗子树构成的。(除非起点u为叶子,则集合S就是这棵树本身,只含有一棵...原创 2018-03-14 14:06:37 · 820 阅读 · 0 评论 -
bzoj3813 奇数国(欧拉函数+树状数组)
其实就是求区间积的欧拉函数。每个数最多分解为前60个质数的乘积,单点修改。开60个树状数组来搞就好了。或者线段树+bitset什么的都好吧qaq原创 2018-04-07 14:32:17 · 328 阅读 · 0 评论 -
CF924D Contact ATC(数学+BIT求逆序对)
这题妙呀。 我们设风速为w时,飞机i通过原点的时间为tx, 风速为-w时,飞机j通过原点的时间为ty。 则如果存在某个风速w,使得i和j能够一个时间通过原点,需要满足(txi-txj)*(tyi-tyj)<=0.这是什么!这就是二维偏序! 所以我们算出tx,ty,求个二维偏序就好了。不过这题大概卡精度,我们要手写分数。 还要注意相等的时候谁在前面的问题。原创 2018-03-25 22:57:52 · 1156 阅读 · 0 评论 -
bzoj2819 Nim(dfs序+树状数组+博弈)
我们知道Nim游戏是否先手必胜只需看异或和是否为0即可。 因此此题我们就是要维护路径异或和和单调修改。 可以dfs序+树状数组来做,维护每个点到根的异或和。原创 2018-04-09 20:22:18 · 237 阅读 · 0 评论 -
bzoj1046 [HAOI2007]上升序列(dp+树状数组+贪心)
首先nlogn求出每个点开始的最长上升子序列长度。 然后每个询问我们贪心地从小到大取能取的即可。 复杂度O(nlogn+mn)O(nlogn+mn)原创 2018-04-09 21:40:12 · 223 阅读 · 0 评论 -
bzoj1049 [HAOI2006]数字序列(dp+BIT+贪心)
这题实在是太神了orz首先考虑第一问。使得修改元素最少,我们不妨补集转化,改为求:最多多少个点可以不修改。 对于j<=ij<=i,如果aj,aia_j,a_i不需要修改,则必须满足ai−aj>=i−ja_i-a_j>=i-j,也就是ai−i>=aj−ja_i-i>=a_j-j,我们令bi=ai−ib_i=a_i-i,则就是要求bi>=bjb_i>=b_j,也即求序列b的最长不下降子序列。答案就是n原创 2018-04-10 21:50:12 · 252 阅读 · 0 评论 -
CF474E Pillars(dp+树状数组)
首先我们有一个显然的O(n2)O(n^2)dp。倒着做即可。 考虑如何优化,对于第i个点,我其实是在i+1~n中的权值>=x+d和权值<=x-d的点中选一个最大的来转移,我们可以用离散化+两个树状数组来实现查询前缀后缀最大值。复杂度O(nlogn)O(nlogn)原创 2018-03-28 19:56:21 · 355 阅读 · 0 评论 -
bzoj4888 [Tjoi2017]异或和(按位+树状数组)
我们首先做出前缀和s[i],那么一个连续和就可以表示成s[i]-s[j],0<=j< i 我们考虑s[i]的第k位-s[j]之后为1的有多少个,如果奇数个就对答案有贡献。如果s[i]的第k位为1,s[j]需要满足第k位为0且前k-1位小于s[i]的前k-1位,或者第k位为1,且前k-1位大于s[i]的前k-1位。如果s[i]的第k位为0同理。 我们可以用两个权值BIT来维护。 复杂度O(nlo原创 2018-04-17 22:45:28 · 472 阅读 · 0 评论 -
bzoj4756 [Usaco2017 Jan]Promotion Counting(dfs+BIT)
dfs+树状数组即可。子树内的贡献就是进子树前存一个,出子树存一个,差就是子树内的贡献。原创 2018-04-12 16:25:47 · 369 阅读 · 0 评论 -
bzoj2780 [Spoj]8093 Sevenk Love Oimaster(SAM+dfs序+BIT)
这个问题和bzoj3881基本一模一样。 3881是拿ACAM+树链的并写的,先把询问串建出ACAM,然后拿文本串去更新答案。这道题呢是拿SAM+dfs序+离线+BIT做的。先把文本串建出SAM,在每个点上挂一个vector记录这个节点所属的文本串。然后对于每一个询问串,先跑出它在SAM上的代表节点p,那么他的答案就是p的子树中不同颜色的个数,用dfs序转化为序列就是求区间内不同数的个数。可以离线原创 2018-04-23 21:51:00 · 288 阅读 · 0 评论 -
bzoj4994 [Usaco2017 Feb]Why Did the Cow Cross the Road III(树状数组)
第一眼直接树套树…菜菜了qaq 其实直接BIT就够了。按顺序扫每一个数,如果第一次出现,就在BIT下标处+1,如果第二次出现,统计以他作为i的答案,即在last[x]~i只第一次出现的数的数。然后把last[x]处的1删掉,表示他已经不止第一次出现了。原创 2018-04-24 13:48:42 · 258 阅读 · 0 评论 -
bzoj5278 [Usaco2018 Open]Out of Sorts(智商题+BIT)
双向冒泡排序,问你需要跑几趟。 定义MiM_i表示前i个数中排序后不在前i个的数的个数。 则MiM_i就是答案的一个下界,因此所有MiM_i的最大值就是答案。 可以用一个BIT来维护。 为啥呢?考虑i,i+1之间的分割点,你每一趟双向冒泡,实际上是使得一个在分割点左边的本应在右边的跑到了右边,同时让一个在分割点右边的本应在左边的跑到了左边。也就是说每一趟最多使得MiM_i-1,因此需要MiM原创 2018-04-21 13:50:10 · 921 阅读 · 0 评论 -
Codeforces Round#485
CF986A Fair(贪心+最短路) CF986B Petr and Permutations(BIT+排列性质)A#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline char gc(){ ...原创 2018-05-31 10:14:09 · 374 阅读 · 0 评论 -
bzoj2124 等差子序列(Hash+树状数组)
给定一个排列,问是否存在长度>=3的等差子序列。如果存在长度>=3的等差子序列,那么一定存在长度为3的等差子序列。我们只需要判断是否存在长度为3的等差子序列即可。我们从前往后做,对于aiaia_i,如果ai−kai−ka_i-k与ai+kai+ka_i+k都已经出现过或者都没出现过那没事,否则只出现了一个的话,另一个一定在后面,就一定会构成一个等差子序列。每个数如果出现...原创 2018-06-23 12:33:11 · 476 阅读 · 0 评论 -
bzoj3594 [Scoi2014]方伯伯的玉米田(贪心+dp+二维BIT)
首先我们贪心地有每次区间操作一定是对一个后缀。 于是我们有f[x][j]表示结尾数字为x,已经进行了最多j个操作的最长不降子序列长度。二维BIT优化一下来转移即可。 复杂度O(nklog2w)O(nklog2w)O(nklog^2w)#include <bits/stdc++.h>using namespace std;#define ll long long#defin...原创 2018-06-15 22:28:32 · 243 阅读 · 0 评论 -
bzoj2434 [Noi2011]阿狸的打字机(AC自动机+fail树+树状数组)
多次询问一个串x在另一个串y中的出现次数。我们先建出ACAM,考虑如何做这件事,就是询问y有多少个节点沿着fail指针能找到x。但是这样太慢,我们不妨反向思考,就是求x沿着反向的fail指针能找到几个y的节点。我们建出fail树(fail指针没有环 每个节点只有一个出度 那么反向之后显然是一棵树 x沿着反向的fail指针所能到达的节点就是x所在的子树)。所以现在就是询问x的子树中有多少个y的节点。我原创 2018-03-23 11:43:27 · 238 阅读 · 0 评论 -
bzoj5158 [Tjoi2014]Alice and Bob(贪心+构造+树状数组+dp)
题目大意:对于一个排列X, 有序列A,Ai为以Xi结尾的LIS长度。 有序列B,Bi为以Xi开头的最长下降子序列长度。 给定A,求最大的∑ni=1Bi\sum_{i=1}^nB_i。真是神题orz“a[i]相同的所有位置必然满足w[i]递减 对于i,为使a[i]合法,w[i]必然比至少一个wj要大 因为w[j]递减,w[i]只需比最靠后的w[j]大即可,j向i连边,这样得到一棵树 贪心地原创 2018-03-12 21:22:45 · 362 阅读 · 0 评论 -
bzoj5157 [Tjoi2014]上升子序列(dp,树状数组优化)
设dp[i]为以a[i]结尾的上升子序列个数,则显然有dp[i]=∑j=1i−1dp[j]∗[a[j]<a[i]]+1dp[i]=∑j=1i−1dp[j]∗[a[j]<a[i]]+1dp[i]=\sum\limits_{j=1}^{i-1}dp[j]*[a[j]O(nlogn)O(nlogn)O(nlogn)答案就是所有的dp值的和,因为要求长度>=2,所以我们最后还要减...原创 2018-03-12 20:14:28 · 600 阅读 · 0 评论 -
bzoj4989 [Usaco2017 Feb]Why Did the Cow Cross the Road(树状数组求逆序对个数)
首先若a,b线段交叉且A[a]< A[b],则B[a]>B[b],若我们给A序列强制从小到大的标号,转换B序列保证符合原题。则线段交叉的对数,就是B序列中逆序对的个数。我们可以用树状数组nlogn求出。然后考虑循环移位,现在只考虑对B序列做循环移位(A序列同理,反过来做即可。),实质上就是对转换后的B序列做循环移位,我们每次只把最后一位挪到最前面,挪n-1次即可得到所有循环移位后的结果。考虑把最后一原创 2017-09-03 12:25:05 · 742 阅读 · 0 评论 -
NOIP模拟9.27
2013提高D1 A.转圈游戏(快速幂)AC B.火柴人排队(树状数组求逆序对)AC C.货车运输(贪心+并查集+树上倍增)AC原创 2017-09-27 11:31:51 · 375 阅读 · 0 评论 -
bzoj3529 [Sdoi2014]数表(莫比乌斯反演+树状数组)
%%%popoqqq大爷的题解:传送门 又掌握了线性素数筛处理sigma函数的技能。。。复杂度O(T*logT+T*sqrt(n)*logn)原创 2017-10-13 22:14:36 · 403 阅读 · 0 评论 -
bzoj4990 [Usaco2017 Feb]Why Did the Cow Cross the Road II(dp+树状数组)
dp[j]表示第二行选择的最后一个位置为j时,最多选择多少对。以第一行做到i划分阶段,则这次只会影响a[i]能连到的的位置j, dp[j]=max{dp[k]| 0<=k< j}+1.这样复杂度是O(n2*9)的,过不了,我们可以用树状数组或线段树维护一下决策的前缀最大值,优化成O(9*nlogn)。原创 2017-10-23 20:16:49 · 540 阅读 · 0 评论 -
suoj20 垃圾显示屏(cdq分治+树状数组)
二维平面,两种操作 1.给(x,y) +1 2.查询矩形(1,1,x,y)的权值和。 二维树状数组开不下,cdq分治,去掉一维,然后用树状数组维护。O(nlog2n)原创 2017-11-30 15:24:35 · 306 阅读 · 0 评论 -
bzoj1901 Zju2112 Dynamic Rankings(主席树+树状数组)
带修改的主席树。回忆我们求区间第k小的怎么求?我们实质上是用两个前缀和去减。那现在有了修改,说明我们需要维护前缀和。那什么东西可以用来快速的维护前缀和呢?树状数组。也就是说我们每次在树状数组上跑,更新logn棵线段树的值。每颗线段树维护树状数组相应的区间信息。然后我们查询的时候,按树状数组那样记下所有正贡献的线段树,和负贡献的线段树。然后若干个线段树的信息合并成正确的信息。 复杂度O(nlog2n原创 2017-12-02 21:33:19 · 438 阅读 · 0 评论 -
bzoj4822 [Cqoi2017]老C的任务(离线+扫描线+离散化+树状数组/KD tree)
因为可以离线做,而且所有点一开始就给定,所以可以用扫描线+树状数组来做。如果强制在线,还可以用kd tree做。原创 2018-01-11 23:21:26 · 380 阅读 · 0 评论 -
bzoj1176 [Balkan2007]Mokia(cdq分治+树状数组)
S据说一直都是0.。。好像是描述有误。。可以直接忽视了。 把每一个询问矩形容斥成4个,使得都是前缀矩形,然后cdq分治就好啦。注意树状数组不能每次O(N)大规模清空,这样复杂度其实是不对的。必须是O((mid-l+1)*logn)的清空。原来我以前写的都是假的orz原创 2018-01-14 15:57:53 · 322 阅读 · 0 评论 -
bzoj3295 [Cqoi2011]动态逆序对(cdq分治+树状数组)
我们把删除操作倒着考虑,变成逐渐加数,每个数按加入的顺序给时间标号tit_i。(没被删过的数随便按顺序给时间标号1…n-m),每个点我们记录三个信息(ti,xi,yi)(t_i,x_i,y_i)分别表示时间标号,位置,数值,每一个点又都是一个询问,答案是加入这个点后增加的逆序对数。那么对于一个询问(t,x,y),他的答案就是满足 ti< t&&xi< x&&yi>y或者ti< t&&xi>x &&原创 2018-01-15 22:13:08 · 398 阅读 · 0 评论 -
bzoj1103 [POI2007]大都市meg(树+差分+树状数组)
给出一棵树,每次查询一个点到根的路径边权和,有边修改。直接差分+树状数组。原创 2018-01-10 14:15:07 · 367 阅读 · 0 评论 -
bzoj1878 [SDOI2009]HH的项链(离线+树状数组/莫队)
这题首先在线是没法做的,所以我们可以考虑离线算法 首先记录下每种颜色的下一种颜色所在的位置 将所有询问按照左端点进行排序 将所有颜色的第一个点x a[x]++ 然后从左往右扫 扫到一个点x将a[next[x]]++ 碰到一个询问l,r输出sum[r]-sum[l-1] 其中sum是a数组的前缀和,求前缀和可以用树状数组 或者也可以直接上莫队,题解:http://www.elijahq原创 2018-01-10 17:27:37 · 314 阅读 · 0 评论 -
bzoj3196 Tyvj 1730 二逼平衡树(树套树,线段树套splay/bit套动态开点线段树)
线段树套splay,看网上题解大部分说套splay是过不去的,需要优越的姿势才可以,本想着过不去再卡一卡优越的姿势的,然而过了qaq。 线段树维护区间,对于线段树的每个节点我们吊一棵splay维护区间内的权值。 操作1:查询k在区间[l,r]上的排名。 线段树上查询区间,去splay上查询小于k的有多少个,都加起来即可,再加1就是k的排名。 操作2:查询区间[l,r]上的排名为k的数。 ...原创 2018-02-25 22:27:11 · 522 阅读 · 0 评论 -
bzoj1146 [CTSC2008]网络管理(树上主席树,树状数组套动态加点线段树)
给定一棵树,查询路径第k大值,带修改。 就是bzoj2588+bzoj3196 树上建主席树。然后对于修改,修改点x的权值,只会对x的子树有影响,而x的子树在dfs序上是连续的一段in[x],out[x],就相当于区间修改,我们利用差分+树状数组来维护,另建bit+动态加点线段树来维护。 树状数组套动态加点线段树内存究竟怎么算.jpg???能开多大是多大好了,反正是要比logn^2小很多?这样原创 2018-02-26 20:45:05 · 379 阅读 · 0 评论 -
bzoj3262 陌上花开(树状数组套splay/cdq分治)
求三维偏序,可以树套树,第一维排序解决,第二维树状数组,第三维splay 或者cdq分治解决,要注意处理相同权值,细节较多。树状数组套splay#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#...原创 2018-02-26 22:03:45 · 355 阅读 · 0 评论 -
CF763E Timofey and our friends animals(线段树+并查集/lct+BIT/瞎搞)
官方正解给的是线段树+并查集,好毒瘤呀!写的我心神俱疲呀orz 我是每个节点维护左边K个点和右边K个点的连通性,还有连通块的个数。然后每次合并两个节点的时候,就暴力枚举K^2条边来并查集维护。再更新对结果的l和r。然后每次查询的时候就直接合并logn个节点即可。当节点的区间长度不足k时太毒瘤啦!【我写的简直太丑了】复杂度O(nlognk2+qlognk2)O(nlognk2+qlognk2)O(...原创 2018-03-15 11:40:12 · 1124 阅读 · 0 评论 -
Codeforces Round#470
CF948A Protect Sheep(模拟)没看到输出“Yes”卡了二十分钟【再见】CF923A Primal Sport(线性素数筛,数学)CF923B Producing Snow(树状数组+二分/平衡树)CF923C Perfect Security(贪心+Trie)CF923D Picking Strings(手玩题)原创 2018-03-11 12:35:18 · 418 阅读 · 0 评论 -
bzoj5191 [Usaco2018 Feb]Slingshot(离线+树状数组)
对于a,b答案就是 minni=1|a−xi|+|b−yi|+timin_{i=1}^n{|a-x_i|+|b-y_i|+t_i} 根据a与x,b与y的大小关系分四类讨论。 比如第一类:xi<=a,yi<=bx_i<=a,y_i<=b 答案就是a+b−xi−yi+tia+b-x_i-y_i+t_i,设 vi=−xi−yi+tiv_i=-x_i-y_i+t_i,于是乎我们在满足条件的i中挑一原创 2018-03-04 15:08:34 · 387 阅读 · 0 评论 -
bzoj4765 普通计算姬(分块+树状数组)
分块大法好啊qaq 我们按编号分块,预处理出f[x][i]表示改动x节点对第i块的影响有几个点 然后dfs序+BIT维护一下子树和。 复杂度O(m(n−−√+logn+n−−√logn))O(m(n+logn+nlogn))O(m(\sqrt n+log n+\sqrt n logn))#include <bits/stdc++.h>using namespace std;...原创 2018-06-16 21:52:55 · 331 阅读 · 0 评论