![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树状数组
FSYo
我不去想是否能够成功,
既然选择了远方,
便只顾风雨兼程
展开
-
The Battle of Chibi[树状数组+DP]
传送门f[i][j] 表示1--i 选j个的情况 先离散化 , 然后开n个树状数组分别维护 f[][j] #include<bits/stdc++.h>#define N 1005#define Mod 1000000007#define LL long longusing namespace std;int T,n,m,a[N],b[N];LL f[N...原创 2018-11-19 20:46:55 · 151 阅读 · 0 评论 -
P1198 [JSOI2008]最大数 [树状数组]
传送门将整个序列从200000开始倒着插入 , 然后就是树状数组维护前缀最大了#include<bits/stdc++.h>#define N 200000using namespace std;int c[N+50],m,d,ans,tot;void Up(int x,int val){for(;x<=N;x+=x&-x) c[x] = max(c[x...原创 2018-12-15 15:29:40 · 199 阅读 · 0 评论 -
树状数组应用汇总 [全]
1. 逆序对 : 树状数组维护比当前小的个数 , 权值作为下标 , 需要离散化 , 也可以扩展到前后比自己大或小的个数 2. 二维偏序问题 : 一维排序 , 二维树状数组 , 也是权值作为下标 , 在树状数组中插入1表示出现 ,以后可以辅助CDQ分治解决三维偏序 3. 维护区间第k大 , 方法1 : 二分答案 logn^2 , 不在赘述方法2 : 将树状数组二进制拆分 , ...原创 2018-12-15 23:09:20 · 353 阅读 · 0 评论 -
最小面积1 [模拟][或树状数组]
传送门可以把最外两层取出来然后枚举选哪一个出来 , 这样做是O(1)的我的做法是枚举每次少哪一个点 , 在树状数组里修改 , 然后查最大最小就可以 , 这样是O(nlogn)的另外 , 注意 #define inf 0x7fffffff如果是0x3fffffff的话不够大#include<bits/stdc++.h>#define N 50050#def...原创 2018-12-30 14:24:56 · 181 阅读 · 0 评论 -
前缀中位数 [树状数组]
传送门 树状数组维护中位数 #include<bits/stdc++.h>#define N 200050#define R registerusing namespace std;int n,a[N],b[N],c[N];int read(){ int cnt=0; char ch=0; while(!isdigit(ch))ch=getchar(); wh...原创 2019-01-04 20:35:59 · 661 阅读 · 0 评论 -
方伯伯的玉米田 [DP + 树状数组]
表示到i 拔j次的最长是多少x按顺序插入 , 二维树状数组维护a[x]+y,y#include<bits/stdc++.h>#define N 10050#define M 550#define K 5050using namespace std;int c[M][M+K],a[N],f[N][M],n,k,ans,mx;void Insert(int x...原创 2019-01-04 22:22:29 · 193 阅读 · 0 评论 -
立方体大作战tet [bzoj1106] [贪心+树状数组]
传送门考虑贪心我们发现型如 123421, 先消2很明显比先消1优型如123412, 并没有差异型如131242, 二者互不影响, 而所有数的关系只有以上3中因此我们进来一个消一个, 树状数组查它们中间有多少个数, 然后将那两个位置清零所以我们贪心可以考虑几种情况,逐一比较, 找到最优的贪心策略#include<bits/stdc++.h>#define...原创 2019-01-31 23:26:54 · 200 阅读 · 0 评论 -
19.02.15 Test 3 题 (easy)
光盘用一个栈存初始状态,两个栈模拟一下即可#include<bits/stdc++.h>#define N 100050using namespace std;struct STA{ int s[N],top; void init(){top=0;} void Push(int i){s[++top] = i;} int Top(){return s[top];...原创 2019-02-15 15:53:36 · 138 阅读 · 0 评论 -
P4145 花神游历各国 [并查集+树状数组 / 线段树]
传送门法1: 发现根号开几次就没了, 于是可以并查集动态维护区间的一段1, 遇到区间一段就直接跳到下一个不为1的地方如果不是1就树状数组暴力单修法2: 线段树维护区间最大, 如果最大<=1 就直接跳过, 否则递归修改儿子树状数组+并查集#include<bits/stdc++.h>#define N 100050#define LL long long...原创 2019-01-30 11:01:58 · 175 阅读 · 0 评论 -
P4309 [TJOI2013]最长上升子序列 [vector+树状数组]
传送门考虑每新加进来一个数, 要么答案还是之前的, 要么这个数重新更新一个发现数是按顺序插入的, 也就是说一个数无论放在哪里, 它后面的数对它都没有影响于是我们可以用平衡树之类的东西先把原序列搞出来然后按位置插入当前位置的值, 更新当前的DP值可以树状数组维护, 然后惊讶地发现平衡树那一步可以用vector水#include<bits/stdc++.h>...原创 2019-03-03 20:51:26 · 236 阅读 · 0 评论 -
P2464 [SDOI2008]郁闷的小J [树状数组+离线]
传送门树状数组好题如果按照题意直接做,也就是在线算法,用任何一种数据结构都难以实现,需要“树套树”即可持久化数据结构。• 本题需要使用离线算法。也就是将所有询问先读进来再进行处理。• 所谓“更改书”,可以理解为两种操作:先将原来的书删除,再插入新的书• 假设只有一种书(思维减法),那么只需要维护三种操作:• 在第i个位置插入书/在第i个位置删除书。• 询问第i..j的位...原创 2018-12-15 14:00:07 · 196 阅读 · 1 评论 -
WOJ 1718 FloatingMedian [树状数组] [区间第K大]
传送门其实就是动态维护一个树状数组 , 然后中位数就是区间第(k+1)/2 大我们可以对树状数组二进制拆分 , 如果当前答案加上枚举的这个区间的值不超过 (k+1)/2 就加上这个答案 , 复杂度是logn 的#include<bits/stdc++.h>#define LL long long#define Mod 65536#define Next(x) (...原创 2018-12-15 13:31:21 · 426 阅读 · 0 评论 -
Cow Sorting [树状数组][逆序对]
传送门考虑每个点的贡献,即为它与前面的数构成的逆序对个数+前面比它大的数两个树状数组维护一下就可以了#include<cstdio>#include<cstring>#define N 100005#define LL long longusing namespace std;int c[N],n; LL ans,val[N];int Q1(int...原创 2018-11-17 21:32:43 · 174 阅读 · 0 评论 -
楼兰图腾[树状数组]
传送门权值树状数组维护一下左边右边比当前大或小的个数,乘起来就可以了#include<cstdio>#include<cstring>#define N 200050#define LL long longusing namespace std;int c[N],a[N],n,l[N],r[N]; LL ans;void Up(int x,int va...原创 2018-11-18 15:35:07 · 158 阅读 · 0 评论 -
Lost Cows[树状数组+二分]
传送门我们倒过来做,对于当前的x,他前面有dx个比它小,那么它就是当前的第k大这个第k大我们二分一下就好了,这个数完了过后,把它在树状数组里的值改为0就可以了#include<cstdio>#define N 8050using namespace std;int c[N],n,d[N],a[N];void Up(int x,int val){for(;x<...原创 2018-11-18 16:12:55 · 237 阅读 · 0 评论 -
鬼子进村[树状数组+二分答案]
传送门 [树状数组+二分答案]如果被封锁,就在树状数组里插入1然后每次查询二分找前面和后面第一个为1的地方就可以了对于修复,用一个栈维护复杂度O(nlogn^2)#include<bits/stdc++.h>#define N 50050using namespace std;int n,m,c[N],sta[N],top,vis[N];void Up...原创 2018-12-01 11:25:52 · 211 阅读 · 0 评论 -
送花[树状数组+二分]
传送门以c为下标插入树状数组 , 然后二分求最大最小 , 按题目要求删除,插入就好 #include<bits/stdc++.h>#define N 1000050#define LL long longusing namespace std;int c[N],w[N],tot; LL ans1,ans2;void Up(int x,int val){for(;...原创 2018-12-01 13:34:48 · 285 阅读 · 0 评论 -
[JSOI2009]计数问题 [二维树状数组]
传送门我们发现m,n,c 都比较小 , 我们就每一个颜色建一个二维树状数组#include<bits/stdc++.h>#define N 305#define M 105using namespace std;int c[N][M][N],n,m,val[N][N];void Up(int x,int y,int z,int val){ for(int i=x;...原创 2018-12-08 22:45:08 · 126 阅读 · 0 评论 -
光荣的梦想[逆序对]
传送门水一道题 , 注意逆序对是严格大于 , 所以每次树状数组查询都要查<=x的#include<bits/stdc++.h>#define N 100050#define LL long longusing namespace std;int c[N],n; LL ans;void Up(int x,int val){for(;x<=N-50;x+=x...原创 2018-12-09 22:48:49 · 421 阅读 · 0 评论 -
树状数组 [区间加区间求和]
考虑差分 设 那么 假设我们要求 那么sigma 中间的定值可以提出来 于是维护两个差分数组 di 与 i * di#include<bits/stdc++.h>#define N 100050#define LL long longusing namespace std;LL t1[N],t2[N]; int n,m;void Up...原创 2018-12-15 13:03:13 · 1345 阅读 · 0 评论 -
矩阵树状数组(矩阵加矩阵求和)
将矩阵分为很多由lowbit 组成的小矩阵 , 然后就跟树状数组一样维护了求和的时候用矩阵前缀和的思想(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]) 单点修改时将(x1,y1)加 , (x2+1,y2) 减 , (x1,y2+1) 减 , (x2+1,y2+1) 加复杂度是 O((logn)*(logm)) 我们考虑如何矩阵加...原创 2018-12-15 13:20:43 · 717 阅读 · 0 评论 -
NOIP模拟19/07/06
WOJ4059 斐波那契每次贪心选出最长的一段, 枚举45个斐波那契数, 如果存在 fib[i] - 当前数 出现, 就不合法说一下我考场的做法预处理每个数右边第一个与它组成斐波那契的位置 r[i]可以单调队列优化如何判断呢? 如果合法, 那么(j+1 -- i) 区间的最小的r[i] 应该大于i, 写个st表就可以了#include<bits/stdc++....原创 2019-07-06 17:27:47 · 221 阅读 · 0 评论