![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树状数组
文章平均质量分 79
逍遥Fau
为伊蕾娜献上心脏!
展开
-
Codeforces540E Infinite Inversions (区间离散化 + 树状数组求逆序对)
题目链接: Infinite Inversions大致题意给定一个无限长的序列p=1,2,3,...p = { 1, 2, 3, ... }p=1,2,3,..., 有mmm次操作, 第iii次交换(ai,bi)(a_i, b_i)(ai,bi)两个位置的元素.问: 完成mmm次交换后, 序列中有多少个逆序对.解题思路思维 + 树状数组我们考虑到, 其实没有被交换过的位置, 我们可以通过线段缩点的方式, 把一个线段变成一个孤立点.即: 对于每段线段, 我们存储其左端点 和 线段长度. (原创 2021-11-09 10:24:34 · 169 阅读 · 0 评论 -
Codeforces459D Pashmak and Parmida‘s problem (树状数组 逆序对)
题目链接: Pashmak and Parmida’s problem大致题意给定长度为nnn的序列aaa.问有多少个(i,j)(i, j)(i,j)满足f(1,i,ai)>f(j,n,aj)f(1, i, a_i) > f(j, n, a_j)f(1,i,ai)>f(j,n,aj).其中f(l,r,c)f(l, r, c)f(l,r,c)定义为[l,r][l, r][l,r]中满足ak=c,k∈[l,r]a_k = c, k \in[l, r]ak=c,k∈[l,r]的数原创 2021-10-29 15:25:01 · 80 阅读 · 0 评论 -
HDU6964 I love counting (树状数组 + 01Trie)
题目链接: I love counting大致题意给定一个长度为nnn的序列, 进行mmm次询问:l r a b 询问[l,r][l, r][l,r]区间有多少种不同的数值ccc, 满足c xor a≤bc \ xor \ a \le bc xor a≤b.解题思路01Trie + 树状数组我们考虑把所有询问离线, 按照rrr从小到大排序.我们考虑到对于排序后的询问: 一旦某个数字同时在iii 和 jjj位置出现(i<j, a原创 2021-10-23 19:06:08 · 103 阅读 · 0 评论 -
牛客挑战赛39 牛牛的等差数列 (线段树 / 树状数组) (等差数列 高阶差分 高阶前缀和)
题目链接: 牛牛的等差数列大致题意给定一个长度为nnn的序列, 有mmm次如下操作:1 l r k d 表示对区间[l,r][l, r][l,r]加一个首项为kkk, 公差为ddd的等差数列.2 l r md 表示询问区间[l,r][l, r][l,r]的和, 并对mdmdmd取模.解题思路首先, 推荐这个题目的弱化版, 区间修改, 单点查询 ➡️ 题目弱化版点这里!!!⬅️本题的mdmdmd取值是位于[3,25][3, 25][3,25]之前的素数, 数值乘积大概为10810^8108,原创 2021-10-18 09:43:58 · 713 阅读 · 5 评论 -
HDU5869 Different GCD Subarray Query (区间gcd 离线查询 + 线段树/树状数组)
题目链接: Different GCD Subarray Query大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.多次询问, 每次询问[l, r]区间, 在该区间内所有子数组能产生多少种不同的gcd.解题思路离线查询 + 树状数组/线段树首先理解一下题意, 说白了就是每次询问有两层循环, i从l->r, j从i->r, 对于每一个子数组[i, j], 把所有元素求gcd, 放到一个set里. 最后问你set里有多少个元素. (所以读完发现了一个 n3还带lo原创 2021-05-11 15:13:17 · 192 阅读 · 0 评论 -
HH的项链 (三种解法) (离线查询 + 线段树/树状数组 or 主席树)
题目链接: HH的项链大致题意解题思路离线查询 + 线段树/ 树状数组 or 主席树解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 看看有多少个不重复的数字. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置有多少个不重复元素.当加到第index个位置时, 有两种情况: ①该数字在之前没有出现过 ②该数字在之前出现在pos位置过(pos < index). (关于位置pos的维护, 我们可以采用哈希表)对于情况①, 我原创 2021-05-11 12:46:07 · 2008 阅读 · 5 评论 -
HDU3333 Turing Tree (离线查询 + 线段树/树状数组 or 主席树)
题目链接: Turing Tree大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.询问: 多次查询, 每次查询[l, r]中去重后的元素总和.解题思路离线查询 + 线段树/ 树状数组 or 主席树相思题目推荐解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 求不重复的元素的总和. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置不重复元素之和.当加到第index个位置时, 有两种情况: ①该数字在之原创 2021-05-11 13:23:03 · 257 阅读 · 0 评论 -
A Simple Problem with Integers(线段树 / 树状数组)
题目链接: A Simple Problem with Integers大致题意有两种操作: ①给区间[l, r]所有元素增加c ②查询区间[l, r]中所有元素值的和解题思路线段树区间修改 + 区间查询, 维护的数值为区间中的元素和同样本题也提供一种树状数组的做法.AC代码(线段树做法)#include <iostream>#include <cstdio>#define rep(i, n) for (int i = 1; i <= (n); ++i原创 2020-11-24 12:50:19 · 947 阅读 · 2 评论 -
敌兵布阵(线段树 / 树状数组)
题目链接: 敌兵布阵解题思路本题是非常基础的线段树模板考察线段树的单点修改 + 区间查询, 当然, 树状数组也可以处理本题, 所以给出两种思路供参考.AC代码(线段树)#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)using namespace std;typedef long long ll;const int N = 5E4 + 10;int w[N];struct原创 2020-11-24 12:48:34 · 966 阅读 · 0 评论 -
POJ2828 Buy Tickets (树状数组 or 线段树) 插队问题
题目链接: Buy Tickets大致题意有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。解题思路这里放一道类似的题目. Lost Cows二分+树状数组 or 线段树对于这种插队问题, 我们都需要采用逆向思维, 从后往前去想. 这样可以保证当前人所在的位置不会被之后的人挤掉.举个例子: 如果有10个人, 第二个人说他要排在第五个位置, 假设这时候第三个人说他要排在第二个位置, 那你会发现, 如果你从前往后去想, 第二个人的原创 2021-05-03 19:47:32 · 226 阅读 · 0 评论 -
POJ2352 Stars (树状数组) (二维偏序问题)
题目链接: Stars大致题意给出n个点坐标, 按照y升序的顺序, 若y相同, 则按照x升序的顺序.一个点坐标小于另一个点坐标的含义是, 横纵坐标都不大于另一个点坐标(保证没有两个点坐标完全相同). 对于给出的n个点中, 定义该点等级为: 小于该点的所有坐标之和.问: 对于0~n-1的所有等级, 输出有多少个点坐标为该等级.解题思路树状数组这题是典型的 二维偏序问题. 由于按照y的升序给出, 所以我们可以在x轴上建立树状数组. 其内记录对于index位置, 有多少个点的x值 <= ind原创 2021-05-03 20:08:45 · 531 阅读 · 0 评论 -
P4062 Yazid 的新生舞会 (树状数组维护三阶前缀和)
题目链接: P4062 Yazid 的新生舞会大致题意给定一个长度为nnn的序列, 问有多少个区间[l,r][l, r][l,r]满足, 区间中有某个数字出现次数严格大于区间长度的一半.解题思路思维 + 高阶前缀和 + BIT (好神奇的题)我们考虑枚举每个数字作为区间严格众数时的贡献.我们不妨认为当前枚举的数字numnumnum为111, 其余数字为000. 假设区间[l,r][l, r][l,r]满足要求, 则区间中111的数量需要严格大于000的数量. 由于要求区间中111的数量, 我们不原创 2021-10-14 15:27:33 · 378 阅读 · 0 评论 -
P1438 无聊的数列 (三种解法 线段树 / 树状数组) (等差数列 高阶差分 高阶前缀和)
题目链接: P1438 无聊的数列大致题意给定一个长度为nnn的序列, 有mmm次如下操作:1 l r k d 表示给区间[l,r][l, r][l,r]加上一个首项为kkk, 公差为ddd的等差数列.2 pos表示查询pospospos位置的数值是多少.解题思路写在前面: 如果你没有做过静态区间加等差数列, 推荐博客➡️点这里⬅️思路一: 线段树维护差分一般的区间修改操作, 我们很容易想到用线段树, 但是我们无法直接给某个区间加等差数列, 因为每个位置被修改的数值是不相同的. 我们考虑对原创 2021-10-17 14:35:56 · 1017 阅读 · 0 评论