
树状数组
ACkingdom
这个人很懒,什么都没有留下
展开
-
P5677 [GZOI2017]配对统计(树状数组)
题目链接 题意: 成为一个配对需要的条件是两个数在数组中的差值的绝对值最小,给你一个区间,求区间内一共有多少对配对。 思路: 首先排序处理原数组,然后在相邻位置找配对,再将找好的配对排序,将位置信息保留,放入树状数组中,查询区间内有多少配对的位置在查询范围内即可。 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.ti原创 2020-06-15 19:46:38 · 282 阅读 · 0 评论 -
洛谷-P1966 火柴排队(归并排序or树状数组求逆序对进阶+离散化)
题目链接 题意: 给你两个数组,相邻两个数字之间可以互换位置,求交换位置至少多少次后可以使得∑(ai-b)^2最小。 思路: 离散化a[i]与b[i]数组后开一个c[i]数组令c[a[i]]=b[i],求c[i]数组的逆序对个数即可。 代码: 树状数组代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);co原创 2020-06-09 21:29:27 · 185 阅读 · 0 评论 -
树状数组总结
这篇博客里有对树状数组的详细教学(讲的真的很6批,清晰且通俗易懂)→教学博客网址 建立树状数组的目的: 对一个数组的所有位置能够更快的,更迅速(不论是时间上还是空间上)的每一个位置的前缀和。运用方式有很多的变形,但最终还是要归到如何快速的求一个数组的前缀和上。 基础应用: 单点修改+区间求和 求逆序对 求逆序对+离散化运用 区间修改+单点求值 区间修改+区间求和 核心代码: int lowbit(int k) { return k&(-k); } int update(int p,int k原创 2020-06-04 20:42:04 · 168 阅读 · 0 评论 -
洛谷-P3372-线段树 1(区间修改,区间求和)
题目链接 题意: 给你一个数组,对该数组进行区间修改和区间求和操作。 思路: 差分进行区间修改,再开一个数组对拆分后的数组求和。 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=5e5+5; const int inf=0x3f3f3f3f; int n原创 2020-06-04 20:26:24 · 236 阅读 · 0 评论 -
洛谷-P1908 逆序对(树状数组,离散化)
题目链接 题意: 求大小为n的数组中有多少个逆序对。 思路: 因为n<=1e5,但是a[n]<=1e9,而且这道题和每一个a[i]的具体数值并没有任何关系,所以我们要用到离散化思想,将a[n]中的数字排序后重新赋值。之后就是正常的树状数组求逆序对方法。 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.ti原创 2020-06-03 20:33:46 · 231 阅读 · 0 评论 -
洛谷-P3368 树状数组模板2(利用树状数组与拆分实现或线段树实现)
题目链接 题意: 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上 xx; 2.求出某一个数的值。 思路: 将拆分的数组放入树状数组中求和 代码: #include<bits/stdc++.h> using namespace std; //#define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=5e5+5; const int in原创 2020-06-02 20:32:45 · 217 阅读 · 0 评论 -
ACWING-241.楼兰图腾(利用树状数组求逆序对)
题目链接 题意: 西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。 西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),…,(n,yn),其中y1~yn是1到n的一个排列。 西部314打算研究这幅壁画中包含着多少个图腾。 如果三个点(i,yi),(j,yj),(k,yk)满足1≤i<j<k≤n且yi>yj,yj<yk,则称这三个点构成V图腾; 如果三个点原创 2020-06-01 20:14:33 · 298 阅读 · 0 评论 -
洛谷-P3374-树状数组模板题
题目链接 题意: 给你一个数组,对这个数组进行单点修改或区间求和. 思路: 树状数组模板 代码: #include<bits/stdc++.h> using namespace std; #define int long long #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); const int N=1e6+7; const int inf=0x3f3f3f3f; int n,m,tree[2000005]; in原创 2020-05-31 21:35:19 · 244 阅读 · 0 评论