LA 4329 树状数组(BIT) 维护更新一段区间的前缀和
来源:互联网 发布:知其不善则速改以从善 编辑:程序博客网 时间:2024/06/05 19:46
树状数组(BIT)的标准用法:动态地修改单个元素值,并求前缀和。
这里进行了一次转化,把一个数是否出现赋值为1或0.
这题要求某个元素前面比它小的元素个数和后面比它小的元素个数,可以用两个输转数组维护。
代码:
#include<iostream>#include<cstdio>#include<vector>#include<string>#include<queue>#include<cmath>#include<algorithm>#include<cstring>#define maxn 20005#define maxm 100005#define INF 0xfffffff#define mem(a,b) memset(a,b,sizeof(a))#define FOR(i,s,t) for(int i=s;i<=t;i++)#define ull unsigned long long#define ll long longusing namespace std;int a[maxn],c[maxm],mi[maxn],ma[maxn];//x[j]表示从做到右是否出现过j=a[k] (1<=k&&k<=i)//c[]即x数组的前缀和,mi即从1到i-1,小于a[i]的元素个数//x2[],c2[],ma[] 从右向左,基本同理。int lowbit(int x){ return x&(-x);}void add(int x,int d){ while(x<=maxm) { c[x]+=d; x+=lowbit(x); }}int sum(int x){ int ret=0; while(x) { ret+=c[x]; x-=lowbit(x); } return ret;}void init(int n){ for(int i=1;i<=n;i++) { mi[i]=0,ma[i]=0; } memset(c,0,sizeof(c));}int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); init(n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); add(a[i],1); mi[i]=sum(a[i]-1); } memset(c,0,sizeof(c)); for(int i=n;i>=1;i--) { add(a[i],1); ma[i]=sum(a[i]-1); }// output(n); ll ret=0; for(int i=1;i<=n;i++) { ret=ret+(ll)mi[i]*(n-i-ma[i])+(ll)(i-1-mi[i])*ma[i]; } printf("%lld\n",ret); }return 0;}
- LA 4329 树状数组(BIT) 维护更新一段区间的前缀和
- poj3468 树状数组解法(树状数组维护区间更新)
- 区间信息的维护和查询系列算法-树状数组
- POJ3468 树状数组的区间更新和区间求和
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
- poj3468 树状数组的区间快速更新和查询
- AC dreamoj 1011 树状数组+hash维护字符串的前缀和
- 树状数组维护区间最大值
- 树状数组 区间更新
- 树状数组区间更新
- LA 4329 树状数组
- LA 4329 树状数组
- Codeforces 731D 求所有区间的交(树状数组或前缀和)
- 一维树状数组和二维树状数组和三维树状数组的区间更新单点求值
- 树状数组的单点更新,区间查询。
- HDU 5480 Conturbatio(二维树状数组维护区间和)
- 区间信息的维护与查询1(树状数组)
- 1019(树状数组的区间更新,区间求和)
- JDBC的使用——Statement
- Objective-C method "isMemberOfClass"
- 用MyXls生成Excel报表(C#)
- java 数组求最大值
- 我的第一篇博文
- LA 4329 树状数组(BIT) 维护更新一段区间的前缀和
- 接下来要学习的知识
- Linux学习之道:linux下iconv()函数的用法
- js获取浏览器名称
- android WebView js 交互
- servlet 当中操作文件
- Python核心编程第二章课后习题
- Java Ant build.xml详解
- dba_extents和dba_segments不一致问题及原因