![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构-----树状数组
柒月 流火
菜
展开
-
Stars POJ - 2352 树状数组 入门题
题意每个星星都有一个等级,横纵坐标都不超过他的星星数即为他的等级思路给定的y都是升序排列的,所以每次只需更新x即可。边更新边插入#include<cstdio>#include<cstring>const int maxn=32768;int c[maxn]; //存放星星int val[maxn]; //存放等级int n;int ...原创 2018-10-23 16:12:50 · 174 阅读 · 0 评论 -
HDU - 4417 Super Mario 主席树 || (离线)树状数组 求区间中不大于某一个数的值有多少个
HDU - 4417 Super Mario 题意:有n个数,m次询问,每次询问 L R k,求在区间 [L,R] 中小于等于 k的数有多少个。思路:用主席树来维护,每次只需要找到序列 b 中第一个等于 k 的数,那么要求的数必定在 b[1]~b[upper_bound(k)] 这个范围内,接下来就像线段树统计区间个数那样,若完全包含则直接加上 t[r].sum - t...原创 2019-04-23 20:17:56 · 221 阅读 · 0 评论 -
POJ - 2299 Ultra-QuickSort 树状数组求逆序对
POJ - 2299 Ultra-QuickSort题意:给你一个数组,可以交换相邻的两个数的位置,是数组变为升序排列,求交换的次数。思路:求逆序对,存在几个逆序对就需要交换几次。因为 a[i] 相对于n很大所以需要离散化按照数值从大到小排序,如果不存在逆序对(数值最大的那个点的位置应该也是最大的,在添加一个位置时,这个位置前应该不·存在已经标记的数组),因为按照位置建立树状数...原创 2019-04-05 12:57:15 · 154 阅读 · 0 评论 -
敌兵布阵 HDU - 1166
线段树#include<cstdio>const int maxn=50000;int sum[4*maxn]; //求和int node[maxn]; //存原数组下标void pushup(int rt) //更新节点信息 这里是求和{ sum[rt]=sum[rt<<1]+sum[rt<<1|1];} // build...原创 2018-10-16 21:23:57 · 150 阅读 · 0 评论 -
Codeforces 920F - SUM and REPLACE 线段树
Codeforces 920F - SUM and REPLACE题意:给定一组长度为n的数组,有m次操作(两种不同的操作)。每次操作输入三个数 t x y,如果 t==1 ,将从 x 到 y 的每一个数都变为D(i) (D(i)为 i 的因子个数),t==2 输出从 x 到 y 的和。思路:线段树。此处需要一点优化。2的因子个数是2,1的因子个数是1,如果需要更新的位置 所存...原创 2019-01-20 15:36:19 · 144 阅读 · 0 评论 -
POJ - 1990 MooFest 树状数组
POJ - 1990 MooFest题意:给定 n 头牛的 听力阈值 和 所在位置,第 i 头牛和第 j 头牛相互交流所需的最小值为 max(Vi,Vj)*(Xi-Xj)。求所有牛相互交流的总和。思路:将牛的听力阈值降序排列。计算时当前牛的听力阈值即为最大所以只需求出 距离和牛数 就能算出当前牛到其他已经存在树状数组中牛的的总和,并更新。这里用到两个树状数组#incl...原创 2018-12-25 22:33:16 · 114 阅读 · 0 评论 -
POJ - 3321 Apple Tree DFS序+线段树 / 树状数组
POJ - 3321 Apple Tree题意;一颗苹果树上有n个树杈,每个树杈都长了一个苹果。C X表示 如果第X个树杈有苹果就摘掉,如果没有就会长出一个。Q X表示 输出X和X的子树杈一共有多少个苹果。1.线段树用线段树+vector就会 TLE#include<cstdio>#include<cstring>#include<...原创 2018-12-24 22:25:45 · 176 阅读 · 0 评论 -
POJ - 3067 Japan 树状数组求逆序对
POJ - 3067题意:东西海岸线分别有n,m坐城市,要修k条公路,求这k条公路的交叉点思路:将公路的 x(s) 按照从小到大的顺序排序,若 x 点相同,则将 y (e) 小的放在前边。两公路如果相交则 ( Xi<Xj & Yi>Yj )。如果在求第k条公路的交点时,前 k-1 条公路的 x 都比他小,我们只需求出这 k-1 条公路有几条 y 比他大就有几...原创 2018-12-18 18:28:07 · 125 阅读 · 0 评论 -
POJ - 2481 Cows
POJ - 2481 Cows 题意:有N头牛,每只牛有一个测试值[S,E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比它强壮。思路:将终点 e 从大到小排序,若终点相同,就让起点s小的在前。以起点...原创 2018-12-17 20:01:02 · 104 阅读 · 0 评论 -
POJ - 2155 Matrix 二维树状数组 (区间更新,单点查询)
POJ - 2155 Matrix 二维树状数组没学过的可以看这篇博客:http://www.cnblogs.com/RabbitHu/p/BIT.html矩阵中每个元素初始化为 0 ,每次更新,相应矩阵中的 0 变为 1 ,1 变为 0 。 更新时只需加 1 ,最后对 2 取模即为答案。 #include<cstdio>#include<cstring>...原创 2018-12-21 22:15:54 · 102 阅读 · 0 评论 -
POJ - 1195 Mobile phones 二维树状数组模板题 (单点修改,区间查询)
POJ - 1195 Mobile phones不会的可以看这篇文章:https://blog.csdn.net/qq_41837216/article/details/85041511#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int...原创 2018-12-16 22:14:18 · 165 阅读 · 0 评论 -
二维树状数组基础详解
<在此感谢原创作者>当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组.通常对一维数组最直接的算法可以在O(1)时间内完成一次修改,但是需要O(n)时间来进行一次查询.而树状数组的修改和查询均可在O(log(n))的时间内完成.一、回顾一维树状数组假设一维数组为Ai,则与它对应的树状数组Ci是这样定义的:C1 = A...转载 2018-12-16 22:08:22 · 561 阅读 · 0 评论 -
POJ - 2029 Get Many Persimmon Trees 二维树状数组+枚举
POJ - 2029 Get Many Persimmon Trees题意:一个宽 w 高 h 的矩阵中有n棵柿子树,选一个宽 s 高 t 的子矩阵,子矩阵中最多有多少棵柿子树#include<cstdio>#include<cstring>#include<iostream>using namespace std;int w,h;int...原创 2018-12-19 16:53:21 · 142 阅读 · 2 评论 -
POJ - 2985 The k-th Largest Group 树状数组 求第k大
题目链接:POJ - 2985 The k-th Largest Group利用树状数组前缀和特性(能求出某个数前边有多少个数比他小),将求第K大的数转换为求第 (num-k+1)小的数 num为数的个数。一开始每个组都只有一只猫,所以一共有n组,此时 c[1]=n (假设 c[ ] 为树状数组),表示只含一只猫的有n组。我们只需要根据原数组 a[ ] (一开始每组只有一只猫所以初始化全...原创 2018-12-12 16:45:01 · 174 阅读 · 0 评论 -
Codeforces Round #223 (Div. 1) C. Sereja and Brackets 离线树状数组
C. Sereja and Brackets 题意:给你一个只包含 '(' 和 ')' 的字符串,由m个询问,每次询问给定一个区间,求区间内 '(' 和 ')' 匹配的个数。思路:观察发现每个 ')' 匹配的 ’(’ 的位置是一定的,我们可以将每一个与之匹配的 ‘(’ 的位置保存起来,将询问按照右端点排序。边更新边查询,在区间范围内被标记点的个数即为括号匹配的对数。(因为在存位置...原创 2019-05-22 17:20:13 · 145 阅读 · 0 评论