
树状数组
风中之神111
我亦飘零久
展开
-
POJ1990--MooFest(转化为树状数组)
题意:n头牛,每头牛有两个值,v和x,两两之间有一个值,设v分别为v1,v2, x为x1,x2,则它们之间的值为abs(x1-x2) * Max(v1,v2), 求所有n*(n-1)/2对牛之间值的总和。思路:看了https://blog.youkuaiyun.com/bestsort/article/details/80853221,有图真好,一下就清楚了,下面的图也是摘自那里按照题意,是求:...原创 2019-08-02 17:46:12 · 248 阅读 · 0 评论 -
POJ2481_Cows(树状数组逆序数)
题意:给了N个线段(N<=10000),现在请输出每个线段被多少个线段包围了。[L,R]要包围线段[l,r]…则L<=l && R>=l && R-L > r-l。思路:先将这些线段排序,左端点升序,右端点降序。排完以后,前面的左端点肯定不会比后面的大,要想包围,就看右端点是否比后面大。这样把右端点单独拿出来作为一个序列。能包围它的...原创 2019-08-02 10:25:23 · 199 阅读 · 0 评论 -
Hdu1394-Minimum Inversion Number(树状数组求逆序数)
题意:一个n的元素组成的序列,依次将序列的第一个元素移到尾部,形成了一个新序列,这样一共能有N个不同的序列,求这些序列最小的逆序数。思路:先求出原序列的逆序数。再依次将首部移到尾部,计算逆序数,取最小。// 逆序模型 + 离散化 #include <cstdio>#include <cstring>#include <queue>#include...原创 2019-08-01 22:33:42 · 183 阅读 · 0 评论 -
POJ3321-AppleTree(树状数组)
题意:给出一个苹果树,每个节点最多只能有一个苹果,一开始都有一个苹果,有两种操作:C X,如果X点有苹果,则拿掉,如果没有,则新长出一个Q X,查询X点与它的所有后代分支一共有几个苹果思路:首先自己对苹果进行编号,每个节点存两个值,一个是dfs访问次序编号left,一个是其子树中最大的编号rig。这个点的右值,包含了当前点所有的后代,后代必然是所有编号大于本节点的点,那么祖先呢,那必然是...原创 2019-08-01 21:43:31 · 212 阅读 · 0 评论 -
Hdu1166——树状数组模板题
树状数组还不会的可以看:https://blog.youkuaiyun.com/WhereIsHeroFrom/article/details/78922383鉴于博客中个别点说的很简短,有时难以理解,这里再补充一些,帮助理解:关于IUPQ模型的理解:IUPQ模型:区间更新,点查询。切入点:差分数组设原数组为A[] = a, b, c, d, e。差分数组B[] = a, b-a, c-b, d-c...原创 2019-08-08 10:25:56 · 229 阅读 · 0 评论 -
POJ2892-Tunnel Warfare(数状数组+二分)
题意:有1-n个村子,3种操作,D- x表示摧毁x村,R表示修好刚被摧毁的村子,Q-x,表示询问你x所在的村子附近连着一共有多少村子是没有摧毁的。思路:用树状数组记录被摧毁的村子的和,p[x],表示1-x共有多少村子被摧毁,然后我们可以用二分查找进行解答,当你询问x村时,如果x村已经被摧毁,那就输出0,否则先找出1-x村有多少被摧毁,假设n个被摧毁,这个时候我们就可以用二分查找,找出x最...原创 2019-08-01 17:29:09 · 177 阅读 · 0 评论 -
POJ3468_A Simple Problem with Integers(树状数组or线段树)
题意:输入 n, m表初始有 n 个数, 接下来 m 行输入两种操作:Q x y 表示询问区间 [x, y]的和;C x y z 表示区间 [x, y] 内所有数加上 z 。思路:线段树模板题。区间更新,区间求和查询也可以用树状数组来做。摘自:https://www.cnblogs.com/RabbitHu/p/BIT.html先回顾区间更新,单点查询的树状数组。再来看区间修改,...原创 2019-08-05 18:46:41 · 239 阅读 · 0 评论 -
Hdu3468_Median Filter(树状数组求中位数)
题意:中值滤波,求在n * n的矩阵中,内(n-2r) * (n-2r)的中值滤波后的子矩阵。中值滤波的方式就是对于每一个可以取到的以(i,j)为矩阵中心的(2r+1)(2*r+1)的子矩阵,将子矩阵中所有数排序后的中位数作为新值,新值不影响后面的值。思路:设窗口为一个边长为(2*r+1)的正方形,每个正方形的中心都要被它范围内的中位数替换。窗口在滑动的过程中,比如向右滑1单位,则左边一列...原创 2019-08-04 20:01:05 · 377 阅读 · 0 评论 -
POJ2985_The k-th Largest Group(树状数组)
转自:https://www.cnblogs.com/wuyiqi/archive/2011/12/25/2301071.html题意:首先给你N只老鼠,M个操作;最开始一只老鼠一个组;输入0,输入两个数i,j;使得i老鼠与j老鼠的组合并;输入1,输入一个数K,求第K大的组有多少只老鼠。思路:第K大就是第n-k+1小,用树状数组求第K小。觉得:https://www.cnblogs....转载 2019-08-04 18:11:17 · 311 阅读 · 0 评论 -
Hdu4605_Magic Ball Game(DFS+树状数组+离散化+离线处理)
题意:给你一棵二叉树,每个节点上都有一个值。然后对于每次询问,对于一个球 (pos , weight),球的目标是到达pos ,球的重量为weight ,球从根节点开始往下走。如果当前节点的值大于球的重量,那么往两边走的概率都是1/2。如果当前节点的值小于球的重量,那么球往左边走的概率是1/8,右边走的概率是7/8。如果两者相等,那么球就会停在该节点上。最后输出从根节点到pos的概率,...原创 2019-08-04 10:48:47 · 352 阅读 · 0 评论 -
Hdu3465_Life is a Line(区间内统计直线的交点个数)
题意:给出 一个区间 ( l r),给出 n条直线,问这些直线有多少交点在区间内思路:区间的两个端点作为两边x和y。求出直线在两个端点的值。先按照Y升序排序,给它编号,然后按照x升序排序,相等则按照y升序。由于已经按照x升序排序,每读到一条边,只需统计当期有多少y比他大,就有多少交点。注意和y轴平行的那些直线!!!#include <cstdio>#include &...原创 2019-08-03 13:41:10 · 252 阅读 · 0 评论 -
POJ3067_Japan(交叉统计转为逆序数)
题意:日本岛东海岸与西海岸分别有N和M个城市,现在修高速公路连接东西海岸的城市,求高速公路的交点个数。思路:东边这边的编号为x,西边为y。(x1,y1)和(x2,y2)交叉时:(x2-x1)*(y2-y1) < 0;也就是要求x和y的大小关系相反。先把x升序固定,然后从头一条边一条边看有多少y大于当前的y,就有多少交叉点。因为可能有多条边出自同一个x,所以排序的时候先按照x升序排序,如...原创 2019-08-03 12:21:54 · 286 阅读 · 0 评论 -
Hdu3584_Cube(三维树状数组)
题意:三维的空间中有两个操作,初始时每个空间元素均为0,然后更新操作是0变1,1变0,是一个空间内的所有元素都更新,然后查询是问这个点的元素是0还是1思路:区间更新,点查询的三维树状数组。记录改变的次数,次数为奇数则最终为1,偶则为0。更新(x1,y1,z1)—(x2,y2,z2)的立方体,如果只更新(x1,y1,z1)则会把更大区间的也更新了,所以利用容斥原理,再去掉多余的,因为更新是+...原创 2019-08-03 10:54:07 · 207 阅读 · 0 评论 -
Hdu5480_Conturbatio(区间求和)
题意:在一个棋盘上有一些"车",他能够攻击到与它同一行或者同一列的棋盘上的所有的格子,现在给出K个棋子的坐标,然后有Q组询问,每一次询问(x1,y1,x2,y2)这个方格内的所有棋子是否能够全部被攻击到。思路:每读入一个车,对其横坐标和纵坐标都维护一个攻击范围。然后查询的时候,如果sum(x2) - sum(x1-1) == x2-x1+ 1,说明全部的行都在攻击范围以内,输出Yes。列同理...原创 2019-08-02 22:36:15 · 170 阅读 · 0 评论 -
Hdu2482_PingPong(树状数组)
题意:由西向东的给定n个人的rank值, 一场比赛的举行必须是裁判的rank值和它的位置都处于要进行比赛的两个人之间, 问最多可以举行多少场比赛.思路:枚举裁判,设裁判左边有多少比他小的有a个,比他大的有b个,右边比他小的有c个,比他大的有d个。那么答案就是ad+bc。所以需要两个树状数组来维护。#include <cstdio>#include <cstring>...原创 2019-08-02 21:27:15 · 194 阅读 · 0 评论 -
SPOJ3267——D-query(主席树)
题意:输入N个数字,查询区间[L,R]中有多少个不同的数字思路:主席树每个位置上保存一个值。保存每个数的位置信息,如果这个数没有出现过,当前位置+1,如果出现过,将之前出现的位置-1,当前位置+1#include <cstdio>#include <cstring>#include <algorithm>using namespace std;...原创 2019-09-05 17:03:15 · 226 阅读 · 0 评论