树状数组

Cows(树状数组)

谁说胖子不能爱 提交于 2019-11-28 18:42:26
Cows Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 24787 Accepted: 8296 Description Farmer John's cows have discovered that the clover growing along the ridge of the hill (which we can think of as a one-dimensional number line) in his field is particularly good. Farmer John has N cows (we number the cows from 1 to N). Each of Farmer John's N cows has a range of clover that she particularly likes (these ranges might overlap). The ranges are defined by a closed interval [S,E]. But some cows are strong and some are weak. Given two cows: cow i and cow j , their favourite clover range

树状数组模板

≯℡__Kan透↙ 提交于 2019-11-28 16:39:36
树状数组 1 单点修改,区间查询 这个没啥好讲的,修改加查询即可,查询时利用前缀和相减即可。 代码 #include<bits/stdc++.h> using namespace std; const int maxn=1000010; int n,q,u,v,k,a[maxn]; long long c[maxn]; int lowbit(int x){ return x&(-x); } void add(int x,long long y){ for(;x<=n;x+=lowbit(x)) c[x]+=y; } long long ask(int x){ long long ans=0; for(;x;x-=lowbit(x)) ans+=c[x]; return ans; } int main(){ scanf("%d %d",&n,&q); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); add(i,a[i]); } while(q--){ scanf("%d %d %d",&k,&u,&v); if(k==1){ add(u,v); } else{ printf("%lld\n",(ask(v)-ask(u-1))); } } return 0; } 树状数组 2 区间修改,单点查询 这道题还是比较简单的,树状数组仅支持“单点修改

Stars(树状数组)

删除回忆录丶 提交于 2019-11-28 13:36:26
Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59608 Accepted: 25426 Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. Astronomers want to know the distribution of the levels of the stars. For example, look at the map shown on the figure above. Level of the star number 5 is equal to 3 (it's formed by three stars with a numbers 1, 2 and 4). And the levels of the stars numbered by 2

浅见树状数组

☆樱花仙子☆ 提交于 2019-11-28 12:32:12
基本思想 根据任意正整数都可以被关于2的不重复次幂的唯一分解性质,若一个正整数x被分为10101,其中等于1的位是0,2,4,所以x可以被分解为2^4 + 2 ^ 2 + 2 ^ 0,进一步,区间为[1, x]的序列可以分成log(x)个小区间: 1 长度为2 ^ 4的[1, 2 ^ 4]; 2长度为2 ^ 2的[2 ^ 4 + 1, 2 ^4 + 2 ^ 2]; 3长度为2 ^ 0的[2 ^4 + 2 ^ 2 + 1, 2 ^4 + 2 ^ 2 + 2 ^ 0]; 树状数组就是一种基于上述思想的一种数据结构,基本用途就是维护前缀和,将x长的序列分成log(x)个区间,更快 基本算法 由上文可知,若区间结尾为r, 那么区间的长度为r在二进制拆分下最小的2的正整数次幂,我们设为lowbit(r). 对于给定的一个序列a,我们设一个数组c,c[x]保存a的序列[x - lowbit(x) + 1, x]中的所有数的和 下图为树状数组的树形结构 该结构满足以下性质:: 1 每个节点c[x]保存以他为根的所有子树的所有叶节点的和 2每个节点c[x]的长度为lowbit(x) 3除了树根,每个节点c[x]的父节点就是c[x + lowbit(x)] 4树的深度为log(x) 求lowbit lowbit(n)表示的是n在二进制下最低的1以及他后面的0构成的数值,那么怎么求呢??? 我们来看

Weak Pair (dfs+树状数组)

ぃ、小莉子 提交于 2019-11-27 22:34:26
Weak Pair (dfs+树状数组) 题意 这个题目是要求:一颗树上,有n个节点,给出每个节点的权值。另外给出一个值k,问有多少对节点满足: \(power[u]*power[v]<=k\) u是v节点的祖先(u不等于v) 解题思路 这个可以找父节点权值满足小于或者等于 \(\frac{k}{power[v]}\) (注意这里可能不能够整除) 我们从根节点出发,一个一个地遍历,走到一个节点就看它前面的父节点有没有符合条件的。这个可以使用树状数组来进行求解,在已经去完重和排好序的数组中查找满足条件节点的位置,和当前节点的位置,注意这里使用的是upper_bound,因为上面的条件可能不能够整除,使用lower_bound不够精确。 代码实现 #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> using namespace std; typedef long long ll; const ll inf=1e18; const int maxn=1e5+7; vector<int> g[maxn]; int sum[maxn]; ll power[maxn]; ll lishan[maxn]; int vis[maxn]; int n, cnt, ans; ll

线段树、树状数组入门

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 19:09:30
HDU-1166 思路:更新区间,结构体内保存最大值 1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 using namespace std; 5 const int MAXN = 5e4+5; 6 int a[MAXN]; 7 struct node 8 { 9 int L,R,sum,la; 10 }tree[MAXN<<2]; 11 //建树 12 void Build(int L,int R,int step) 13 { 14 tree[step].L=L;tree[step].R=R; 15 if(L==R) 16 { 17 tree[step].sum=a[L];return; 18 } 19 int mid=(L+R)>>1; 20 Build(L,mid,step<<1); 21 Build(mid+1,R,step<<1|1); 22 tree[step].sum=tree[step<<1].sum+tree[step<<1|1].sum; 23 } 24 //单点查询 25 int Query(int P,int step) 26 { 27 if(tree[step].L==tree[step].R)return tree[step].sum; 28 int mid=(tree[step

算法竞赛进阶指南观后感

大憨熊 提交于 2019-11-27 18:42:34
字符串Hash + 二分 字符串hash:进制思想,前缀预处理,O(1)查询。二分:连续性。可以解决最长回文子串问题 树状数组 动态维护前缀的东西:前缀和,前缀最值 ST表 倍增思想,可以解决静态区间询问最值问题 离散化 树状数组求逆序对时,先用“桶”记录个数,然后维护前缀和(好像这个东西叫做权值树状数组?) 暂更。。。 来源: https://www.cnblogs.com/happy-MEdge/p/11372207.html

树状数组

痞子三分冷 提交于 2019-11-27 18:21:57
树状数组 :二进制的应用 与线段树的区别:树状数组的问题都可以用线段树解决,树状数组系数少,效率高 修改、查询复杂度 :O(log N) 单点更新、区间查询: C[1]=C[0001]=A[1] C[2]=C[0010]=A[1]+A[2] C[3]=C[0011]=A[3] C[4]=C[0100]=A[1]+A[2]+A[3]+A[4] C[5]=C[0101]=A[5] C[6]=C[0110]=A[5]+A[6] C[7]=C[0111]=A[7] C[8]=C[1000]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8] C[i]=A[i-2^k+1]+A[i-2^k+2]+...+A[i] k:二进制中最低位到高位连续零的长度 Sum(i)=C[i]+C[i-2^k1]+C[(i-2^k1)-2^k2)+... A[i] 包含于 C[i + 2 k ]、C[(i + 2 k ) + 2 k ]... 例如求前7项:C[7]+C[6]+C[4] Sum[7]=sum[111]=C(100)+C(110)+C(111) lowbit:取2^k int lowbit(int x) { return x&(-x); } 更新函数 void updata(int x,int y) { for(int i=x;i<=n;i+=lowbit(i)) c

树状数组

南笙酒味 提交于 2019-11-27 16:25:31
参考:https://hihocoder.com/discuss/question/4956 注意树状数组下标从1开始,所以在主函数运用的时候注意下标的改动 二维树状数组的运用: hiho1336 矩阵 matrix sum #include <iostream> #include <cstdio> #include <cstring> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long LL; const int maxn=1000+5, mod=1e9+7; LL BIT[maxn][maxn]; int N,m; int lowbit(int x) { return x&(-x); } void add(int x,int y,int val) { for(int i=x;i<maxn;i+=lowbit(i)) { for(int j=y;j<maxn;j+=lowbit(j)) { BIT[i][j]=(BIT[i][j]+val)%mod; } } } int sum(int x,int y) { LL ret=0; for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { ret=(ret+BIT

241. 楼兰图腾 (树状数组)

让人想犯罪 __ 提交于 2019-11-27 14:56:31
在完成了分配任务之后,西部314来到了楼兰古城的西部。 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。 西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。 西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),…,(n,yn)(1,y1),(2,y2),…,(n,yn) ,其中y1y1 ~ynyn 是1到n的一个排列。 西部314打算研究这幅壁画中包含着多少个图腾。 如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk) 满足1≤i<j<k≤n且yi>yj,yj<yk1≤i<j<k≤n且yi>yj,yj<yk ,则称这三个点构成V图腾; 如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk) 满足1≤i<j<k≤n且yi<yj,yj>yk1≤i<j<k≤n且yi<yj,yj>yk ,则称这三个点构成∧图腾; 西部314想知道,这n个点中两个部落图腾的数目。 因此,你需要编写一个程序来求出V的个数和∧的个数。 输入格式 第一行一个数n。 第二行是n个数,分别代表y1,y2,…