树状数组
树状数组
酷酷的Herio
这个作者很懒,什么都没留下…
展开
-
P1972 [SDOI2009]HH的项链(离线&BIT)
P1972 [SDOI2009]HH的项链(离线&BIT)思路离线化+BIT,考虑将所有询问区间按rrr从小到大排序,对于某一个区间询问,若出现重复的数,我们只考虑最右边的那一个,因为重复种类只计算一次,这样排序后,正确性是对的,可以手膜几个例子。时间复杂度:O(nlogn)O(nlogn)O(nlogn) ,BITBITBIT的常数非常小,所以跑起来很快。code// Problem: P1972 [SDOI2009]HH的项链// Contest: Luogu// URL: h原创 2021-03-09 22:47:25 · 273 阅读 · 0 评论 -
牛客练习赛22 E.简单数据结构1(BIT&欧拉降幂)
牛客练习赛22 E.简单数据结构1(BIT&欧拉降幂)题意 给定长为nnn序列,有区间加和区间求幂塔值两个操作。思路 用权值BITBITBIT维护差分数组,然后欧拉降幂,这样区间操作就是单点更新lognlognlogn,区间求幂塔值就是log2nlog^2nlog2n。总复杂度:O(mlog2n)O(mlog^2n)O(mlog2n)需要注意的是,区间更新后的值,要在欧拉取模意义下成立。v=mod(v,m)v=mod(v,m)v=mod(v,m)。代码#include&l原创 2021-02-02 14:50:28 · 287 阅读 · 0 评论 -
ABC 186- F - Rook on Grid (BIT)
ABC 186- F - Rook on Grid (BIT)思路分情况讨论:1.先下后右。2.先右后下。将一步的情况归结到第一种里去。首先对于第一种情况,我们只需记录第iii行的障碍的最小列r[i]r[i]r[i]。如果遇到某一行r[i]=1r[i]=1r[i]=1,则后面行的点都不能通过第一种情况走到。然后是第二种情况,同理我们记录第iii列的障碍的最小行c[i]c[i]c[i]。然后我们还需要用一个数组v[i]v[i]v[i],储存第iii列有那几行的最小列障碍在该列。每次统计答原创 2020-12-19 23:41:29 · 614 阅读 · 1 评论 -
Load Balancing(Platinum) (扫描线&BIT)
Load Balancing(Platinum) (扫描线&BIT)题意:给定二维正方形平面,nnn个点(xi,yi)(x_i,y_i)(xi,yi),xi,yix_i,y_ixi,yi为奇数,要求切两刀(一刀竖着切,一刀横着切),使得平面分为四个区域,要求这四个区域点的最大值的最小值是多少。思路:最大值最小化显然是二分的题目,考虑对点按xxx点坐标从小到大排序,从小到大对xxx进行扫描,然后两个树状数组维护yyy上下的区间和,二分查找yyy的值,然后答案去最大值的最小值即可。时间复原创 2020-11-14 22:51:33 · 228 阅读 · 0 评论 -
LC.327. 区间和的个数(BIT)
LC.327. 区间和的个数(BIT)思路:转化为前缀和后对每个当前前缀iii查找前面在区间[pre[i]−r,pre[i]−l][pre[i]-r,pre[i]-l][pre[i]−r,pre[i]−l]的数,因为数据较大,需要离散化。树状数组做法,还可以用线段树,归并排序做。typedef long long ll;#define ins insert#define lowbit(x) x&(-x)class BIT{ private: vector<int&g原创 2020-11-07 10:36:36 · 329 阅读 · 0 评论 -
What Goes Up Must Come Down (树状数组)
What Goes Up Must Come Down (树状数组)思路:树状数组题意:求构造一个峰形数组的最小相邻交换操作次数。一般有相邻交换操作的题目,可以考虑用树状数组做。交换相邻操作的贡献,转化为每个数被其他数交换的次数。一个数要么在峰左边,要么在峰右边。在峰左边则左边的数都比它小,在右边则右边的数都比它小。因此对于一个数我们需要考虑左边和右边比它大的数个数。其个数就是该数被其他数交换的次数,哪边小就放在哪边。因此树状数组左右扫一遍,每次取最小值即可。#include<bi原创 2020-10-12 11:58:17 · 606 阅读 · 0 评论 -
E. String Reversal (树状数组)
E. String Reversal (树状数组)思路:树状数组考虑每个位置的贡献,从最后一个字符开始计算。显然对于相同的字符选取靠前的位置的贡献更小。所以用队列维护相同字母的位置。从后往前遍历,然后用树状数组维护到当前位置有多少位置没排好,每排好一个位置就更新树状数组,每个位置的贡献就是query(pos)−1query(pos)-1query(pos)−1。此时更新树状数组的正确性是因为:在pospospos之前的位置整体向右移动一位,然后又因为pospospos移到他们的前面,抵消了,而p原创 2020-10-12 11:21:59 · 646 阅读 · 0 评论 -
1057 Stack (树状数组+二分)
1057 Stack (树状数组+二分)用stackstackstack+权值树状数组储存对应值,然后二分查找中间值即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e3+5,M=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a,b) memset(a,b,sizeof a)#define lx x<<1#define原创 2020-10-09 20:21:13 · 344 阅读 · 0 评论 -
Josephus Transform(置换群&树状数组)
Josephus Transform(置换群&树状数组)思路:置换群&树状数组。考虑:用树状数组维护第kkk位置的编号。然后我们需要求出kkk对于的置换ppp。p[i]p[i]p[i]表示的含义是 编号为iii的对应人的位置是p[i]p[i]p[i]。然后进行快速幂,得到编号为iii对应的人的位置是ans[i]ans[i]ans[i]。因为要按位置输出,所以修改一下,p[ans[i]]=ip[ans[i]]=ip[ans[i]]=i。注意不能反过来快速幂,即设p[i]p[i]p原创 2020-07-28 17:01:13 · 391 阅读 · 0 评论 -
Finding a MEX(分块&树状数组)
Finding a MEX(分块&树状数组)强行压行,重新整理了一波代码。思路:分块+++树状数组维护。显然度数>n>\sqrt{n}>n的点至多有n\sqrt{n}n个,记为大点。相对应deg[i]<ndeg[i]<\sqrt{n}deg[i]<n的点为小点。所以考虑用树状数组维护这些大点,小点进行暴力。主要用权值树状数组维护,然后二分查找答案。还有一些细节需要注意,比如树状数组从1开始,预先把数组a[]a[]a[]全部加1,便于统计。另外每原创 2020-07-24 17:40:30 · 628 阅读 · 0 评论 -
#145. DFS 序 2
#145. DFS 序 2dfsdfsdfs序转树状数组,然后实现树状数组的区间修改,区间查询,这里我们用差分实现即可。具体维护证明见之前的博客。传送门#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a) memset(a,0,sizeof a)#define lx x<原创 2020-07-17 17:01:39 · 682 阅读 · 0 评论 -
LC.315. 计算右侧小于当前元素的个数
LC.315. 计算右侧小于当前元素的个数传送门思路:离散化权值树状数组。显然因为可能存在负数,所以先离散化一波,然后从右到左遍历,将询问值储存起来,然后更新即可。#define lowbit(x) x&(-x)class Solution {public: int tr[1000005],b[1000005]; void update(int x,int k){ while(x<=2e5){ tr[x]+=k; x+=lowbit(x); }原创 2020-07-11 13:45:49 · 343 阅读 · 0 评论 -
P1168 中位数
P1168 中位数传送门思路:1.对顶堆,大根堆(从大到小)存较小的数,小根堆(从小到大)存较大的数。如果当前数大于大根堆顶,就放入小根堆,否则放入大根堆。然后维护使两堆容量大小之差小于等于1,然后容量较大的那个堆顶元素即是答案。因为题目保证是求奇数个数的中位数,显然比中位数小的个数=比中位数大的个数,所以取多了那一个的堆顶即可。时间复杂度:O(nlogn)O(nlogn)O(nlogn)。#include<bits/stdc++.h>using namespace std;原创 2020-07-06 12:42:52 · 677 阅读 · 0 评论 -
P1637 三元上升子序列(DP+离散化权值树状数组)
P1637 三元上升子序列(DP+离散化权值树状数组)传送门思路:dp+dp+dp+离散化转权值树状数组。显然可以设dp[i][j]dp[i][j]dp[i][j]为长度为iii以a[j]a[j]a[j]结尾的子序列的个数。有转移方程:dp[i][j]=∑k<j,a[k]<a[j]dp[i−1][k]dp[i][j]=\sum\limits_{k<j,a[k]<a[j]} dp[i-1][k]dp[i][j]=k<j,a[k]<a[j]∑dp[i−1][k]显原创 2020-06-27 16:21:03 · 429 阅读 · 0 评论 -
UVA1428 Ping pong(树状数组)
UVA1428 Ping pong(树状数组)传送门思路:权值树状数组。考虑枚举每个位置作为裁判对答案的贡献。显然有两种情况:1.a[l]<a[i]<a[r],l<i<r1.a[l]<a[i]<a[r],l<i<r1.a[l]<a[i]<a[r],l<i<r2.a[l]>a[i]>a[r],l<i<r2.a[l]>a[i]>a[r],l<i<r2.a[l]>a[i]>原创 2020-06-27 15:48:22 · 351 阅读 · 0 评论 -
牛牛种花(树状数组)
牛牛种花(树状数组)传送门思路:将坐标按xxx为第一关键字,yyy为第二关键字从小到大排序,从小到达遍历。然后用树状数组维护yyy的前缀和。离散化处理一下下标即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a) memset(a,0,sizeof a)#define lx原创 2020-06-22 21:44:14 · 376 阅读 · 0 评论 -
A Simple Problem with Integers(树状数组)
A Simple Problem with Integers(树状数组)用树状数组实现 区间更新,区间查询。用两个数组维护区间和。因为∑i=1nai=d1+(d1+d2)⋯+(d1+d2⋯+dn)=n∑i=1ndi−(0×d1+1×d1+⋯+(n−1)×dn=n∑i=1ndi−∑i=1n(i−1)×di\sum\limits_{i=1}^n a_i=d_1+(d_1+d_2)\dots+(d_1+d_2\dots+d_n)=n\sum\limits_{i=1}^nd_i-(0\times d_1+1\原创 2020-06-07 13:11:13 · 661 阅读 · 0 评论 -
P3368 【模板】树状数组 2
P3368 【模板】树状数组 2传送门区间更新,单点查询,用树状数组来维护差分即可。#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;const int N=5e5+5;#define mst(a) memset(a,0,sizeof a)#define lx x<&l原创 2020-06-07 12:41:35 · 277 阅读 · 0 评论 -
敌兵布阵(树状数组)
敌兵布阵(树状数组)思路:树状数组实现单点更新,区间查询。比线段树代码量小点。传送门#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;const int N=1e5+5;#define mst(a) memset(a,0,sizeof a)#define lx x<&l原创 2020-06-07 12:04:21 · 384 阅读 · 1 评论 -
Lost Cows(树状数组)
Lost Cows(树状数组)思路:第k小排名问题,树状数组。因为第iii头牛的排名是前i−1i-1i−1头牛比他小的个数加后i+1∼ni+1\sim ni+1∼n比他小的个数再加1即ansi=cnt1∼i−1+cnti+1∼n+1ans_i=cnt_{1\sim i-1}+cnt_{i+1\sim n}+1ansi=cnt1∼i−1+cnti+1∼n+1.所以可以用后往前算每次算出ansians_iansi,然后用该排名更新树状数组中含有该排名的tree[].tree[].tree[].#原创 2020-06-07 11:26:15 · 715 阅读 · 3 评论 -
lowbit()的原理及证明
lowbit()的原理及使用lowbit()代码:#define lowbit(x) (x&-x) //method 1int lowbit(int x){ return x&(-x);} //method 2int lowbit(int x){ return x&(~x+1);} //method 3原创 2020-04-19 12:29:10 · 1541 阅读 · 0 评论 -
牛客小白月赛24 I.求和 (树状数组&DFS序)
牛客小白月赛24 I.求和 (数状数组&DFS序)题目传送门思路:单点修改和区间查询。用DFS序形成一个数组。再用树状数组求和和更新。AC代码:#include<bits/stdc++.h>using namespace std;const int N=1e6+5;int tr[N],n,m,k,a[N],in[N],out[N],tot;//tr[](tree[...原创 2020-04-19 12:00:00 · 352 阅读 · 0 评论