树状数组
EMber _
人但有追求,世界亦会让路。
展开
-
JZOJ4711Binary 树状数组+二进制处理
这题花了我一个下午+半个晚上,结果改到最后我发现是空间开小了。。。mdzz 好累啊,,我直接贴了。。 题解: 代码:var //i,j,k,p,n,m:longint; c:Array[0..21,0..2150005]of longint; a:Array[0..100005]of longint; b:array[0.原创 2016-08-17 21:16:43 · 273 阅读 · 0 评论 -
bzoj3132上帝造题的七分钟 二维树状数组
具体的话,这是一个实用的技巧,通过差分来做到区间加和区间查询的作用,好像二维线段树或者树套树会挂。 http://blog.csdn.net/qq_35866453/article/details/77199794#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++原创 2017-08-15 20:46:45 · 285 阅读 · 0 评论 -
bzoj4979凌晨三点的宿舍 分治+树状数组+扫描线
Description小Q所在的学校QNU(Quailty Niubi University)的学生公寓由n栋楼组成,这些楼从左往右连成一排,编号依次为1到n,其中第i栋楼有h_i层。现在已经凌晨三点了,但是小Q和他的队友们仍然在刻苦地刷题,从他们房间窗户透出的亮光格外醒目。这时,辛苦了一晚上的小Q饿了,正当他拆完泡面准备倒水的时候,他发现热水壶放在队友那忘记拿回来了。无奈之下,他只好走路去向原创 2017-08-25 23:22:39 · 1146 阅读 · 0 评论 -
一维二维树状数组区间加与区间求和
在一般的情况下,对于区间加与区间求和,我们一般使用线段树。 树状数组在一般情况下,只能够单点查询,修改。 但是我们可以通过差分做到区间加或者区间求和(一维) 我们对于一个区间l,r,要求他们的和a[l]….a[r]。 设b[i]表示相邻两点之间的差(b[i]=a[i]-a[i-1]),那么对于sum(a[l]..a[r]) 明显有sum(a[l]..a[r])=(b[1]+b[2]+….+原创 2017-08-15 20:44:50 · 1392 阅读 · 0 评论 -
bzoj1537 [POI2005]Aut- The Bus 树状数组+DP。
题意:给你一个矩阵,只能从左下走到右上,有一些点有权值,求最大权值,n,m<=1e9,点数<=1e5. 这模型见过不止一次了,最近一次应该是agc19吧,这种明显就二维偏序啊,cdq或者带权lis都可以。 懒得写cdq,写了个带权的lis,具体来说就是做第二维的lis,然后取个最大值,注意所有长度的lis都要算一下,因为带上了权值以后不保证最长就是最大,然后用bit优化一波了,二分会炸。 其实原创 2017-10-01 21:16:07 · 251 阅读 · 0 评论 -
bzoj3155: Preprefix sum 树状数组
题意:动态修改,查询前缀和的前缀和。 一开始下意识树套树,看了看别人长度果断否决了= =,然后没什么思路。 然后我试着化简了一发。。 SSi=∑j=1i(n−j+1)∗a[j]SSi=\sum^{j=1}_{i}(n-j+1)*a[j] 水题。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) fo原创 2017-10-19 18:10:48 · 184 阅读 · 0 评论 -
bzoj1452[JSOI2009]Count 二维树状数组/树套树
题意:求矩阵内某个权值出现次数,可修改。 明显树套树可做,太麻烦而且v<=100,三维数组暴力bit可以做。 不能算是标准的树状数组吧= =毕竟连求和都没用到。 注意空间开太大会T。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i原创 2017-10-04 12:31:42 · 301 阅读 · 0 评论 -
JZOJ5394. 【NOIP2017提高A组模拟10.5】Ping 树上差分 树状数组
题意:有一棵树,给你一些点对,要求这些点对不能联通,问最少需要拆掉多少个点。输出方案。 比赛的时候有想法的一道题目,但是由于比较煞笔所以只想到了树剖,然后觉得万一不能切就亏大了,求稳所以没打。 考虑一对点,他们的路径为x-lca-y,那么对于这条路径上查询是否有被拆掉的点,没有就直接把lca拆掉。 那么我们对于所有点对都这么干,按照dfs序倒着处理,证明的话,把树看成一个序列,会发现按照右端点原创 2017-10-05 21:54:31 · 518 阅读 · 0 评论 -
bzoj3192 [JLOI2013]删除物品 树状数组
题意:箱子再分配问题需要解决如下问题: (1)一共有N个物品,堆成M堆。 (2)所有物品都是一样的,但是它们有不同的优先级。 (3)你只能够移动某堆中位于顶端的物品。 (4)你可以把任意一堆中位于顶端的物品移动到其它某堆的顶端。若此物品是当前所有物品中优先级最高的,可以直接将之删除而不用移动。(5)求出将所有物品删除所需的最小步数。删除操作不计入步数之中。 (6)只是一个比较难解原创 2017-11-07 20:45:54 · 255 阅读 · 0 评论 -
bzoj2789 letters 树状数组
Description给出两个长度相同且由大写英文字母组成的字符串A、B,保证A和B中每种字母出现的次数相同。现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B。Input第一行一个正整数n (2<=n<=1,000,000),表示字符串的长度。第二行和第三行各一个长度为n的字符串,并且只包含大写英文字母。Output一个非负整数,表示最少的交换次数。 Sample Input原创 2017-08-06 21:46:01 · 318 阅读 · 0 评论 -
jzoj5246. 【NOIP2017模拟8.8A组】Trip(trip) 笛卡尔数/二维偏序
Description 多年之后,worldwideD厌倦竞争,隐居山林。 他的家乡开始发展起了旅游业,在一条很长的主干道上,有N个旅游景点,按顺序编号为1到N。根据游客们网上的评分,第i个景点有一个评估值a[i],为了区分开不同的景点,评估值是两两不同的。 今天有M组游客前来旅游,第i组游客选择遍历景点Li到景点Ri这一段路。他们搜到Li到Ri的所有评估值,原创 2017-08-09 09:30:38 · 382 阅读 · 0 评论 -
【GDOI2018模拟7.14】小奇的糖果 树状数组+扫描线
好像上去讲的有点快,主要是本身就挺短,,这里讲的会详细一点。 题意很明显就不说了。题意就不说了,注意线段上的点是不能选的。 首先要明确一个东西,这里说是双向链表维护,是因为我们维护了一个点的前驱后继,这符合双向链表的定义,但是实际上大家把他当作普通数组一样维护就好了。先把横坐标离散化,注意是线性离散的话初值不能是0因为有的坐标可以是0(因为这个所以WA0了)。 首先我们假设我们画的那一条直线在原创 2017-07-14 16:39:09 · 376 阅读 · 0 评论 -
HDU5283 线段树
题意就不讲了,挺好理解的。。暴力很好打。。 其实正解一眼看出来是线段树。。。 题目关键在于在 x 轴和 y 轴上,鱼的坐标变化都是单调的,因为 d 是正值。我们把在一个 矩形内部有多少个点的询问拆分成四个在某个点的左下角有多少个点的询问,然后用一棵线 段树维护鱼的 x 坐标,一棵线段树维护鱼的 y 坐标。对于移动操作,在对应的线段树上进行 区间更新,更新完成后询问该区间内的最大值,若最大值原创 2016-08-14 15:33:36 · 569 阅读 · 0 评论 -
NOIP模拟降雷皇&51nod 1376 最长递增子序列的数量
这两道题目都一样,只不过一个a[i]<=n,51nod 则a[i]<=10^9; 都是用树状数组做,找到那个当前值得最小位置然后插入更新,51nod上因为a[i]<=10^9所以要离散一下。uses math;const mo=1000000007;type node=record x,y:longint;end;var i,j,k,p,n,m,t1,t2,l,tot:lo原创 2016-12-12 21:15:41 · 334 阅读 · 0 评论 -
bzoj1227[SDOI2009]虔诚的墓主人
神TM啊,祝卡bzoj的人全家原地爆炸螺旋升天。 。。 分析:用树状数组维护一下上下的组合数,离散坐标,然后直接算就好了。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define T 101#define fo(i,a,b) for(int i=a;i<=b;i++)#define f原创 2017-04-10 11:12:50 · 282 阅读 · 0 评论 -
bzoj1107[POI2007]驾驶考试egz LIS
又见到神题了。。。 题解做法超神了。。 首先我们可以有一个并不显然的想法,就是把所有的边反向以后,题目要求的条件就变成了从任意一个点到i可到达,同时化简一下可以发现只要最左边和最右边可以到达就好了。 设l[i]表示1-i至少需要加多少条边,r[i]表示n到i需要加多少条边。 可以发现l[i]=i-1-pre,pre为左边LIS的长度,用树状数组维护即可O(nlogn)求出。 r[i]同理。原创 2017-05-08 22:11:08 · 503 阅读 · 0 评论 -
bzoj1112 POI2008 砖块Klo 树状数组
fuxey必须%。。。 树状数组的话,其实就是相当于滑动窗口,然后用树状数组维护当前中位数,总和用前缀和搞一下,就可以直接算了。#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(原创 2017-04-27 09:25:44 · 374 阅读 · 0 评论 -
bzoj2274[Usaco2011 Feb]Generic Cow Protests
题意:给出n个数,问有几种划分方案(不能改变数的位置),使得每组中数的和大于等于0。输出方案数除以 1000000009的余数。n^2dp很好想就不说了。 f[x]=f[x]+f[y] (sum[y]-sum[x-1]>=0) 把条件移项sum[y]>=sum[x-1] 那么我们可以把前缀和离散以后用树状数组求和。 树状数组优化dp。#include<cstdio>#include<cst原创 2017-05-20 10:12:36 · 434 阅读 · 0 评论 -
bzoj1901Zju2112 Dynamic Rankings 带修改可持久化线段树
裸的带修改主席树,套个树状数组。 所以也勉强算是个树套树,嘛不过树套树也能过就是了。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;co原创 2017-06-08 17:02:23 · 410 阅读 · 0 评论 -
【GDOI2018模拟7.12】A 线段树+树状数组
这题用光了我所有的脑细胞,还没A,成功导致我今天比赛瞬间爆炸。。题意略。首先肯定不能用归并无脑求。。。否则你怎么处理后面一问,这里明显提示我们第一问的某些东西可以用到第二问中。 先用树状数组求出总逆序对数,同时算出每一位的贡献。 然后对于第二问我们离线处理,先把所有的处理记录一下,记录每一位被更新的时间。 然后我们按照序列的顺序处理。 对于一个数来说,他的贡献变为0的时刻就是在他前面比他大的原创 2017-07-12 15:59:32 · 289 阅读 · 0 评论 -
bzoj2141 分块套树状数组/树套树
题意:动态维护逆序对,每次会交换两个数。 首先离散一波。 然后这题其实很显然,分块处理先,然后对于每次交换,只有在x,y之间的才有用。 那么在bl[x]+1和bl[y]-1之间的数都是整块,可以直接用bit维护。 否则就是一个块内的,就可以直接暴力维护了。 感觉我的实现姿势不好,写的很丑,看了po姐的感觉惭愧。。于是重新来一了几发。 树套树也可以做。以后回来填坑。#include<cst原创 2017-10-26 16:55:11 · 262 阅读 · 0 评论