hdu5775 Bubble Sort 树状数组维护逆序数
2016-07-29 17:42
169 查看
题目链接
###题意解读
理解冒泡排序的过程
最左坐标值为当前坐标和最终坐标的最小值()
最右坐标值为当前坐标加右边较小数据的个数(每个比当前值小的右边的数据都会和当前值交换)
树状数组从右往左扫,将当前值对应在数组中的位置更新为1,求比其小的数已经有几个存在。
ps:描述不太严谨不想用数学公式咋办,还是看代码吧,理解就好。
###题意解读
理解冒泡排序的过程
最左坐标值为当前坐标和最终坐标的最小值()
最右坐标值为当前坐标加右边较小数据的个数(每个比当前值小的右边的数据都会和当前值交换)
树状数组从右往左扫,将当前值对应在数组中的位置更新为1,求比其小的数已经有几个存在。
ps:描述不太严谨不想用数学公式咋办,还是看代码吧,理解就好。
#include<iostream> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<algorithm> using namespace std; int c[100010]; int n; int lowbit(int x) //计算2^K的值,即下标为X的结点管辖的范围 { return x&(-x);//& } void modify(int pos,int num) //pos为数组下标位置,num为要增加的值 { while(pos<=n) //n为数组的长度 { c[pos]+=num; pos+=lowbit(pos); } } int getResult(int pos){ int sum=0; while(pos>0){ sum+=c[pos]; pos-=lowbit(pos); } return sum; } void f(int time){ int a[100010]; int left[100010];//最左值 int right[100010];//最右值 scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); left[a[i]]=min(a[i],i); } for(int i=n;i>=1;i--){ right[a[i]]=i+getResult(a[i]); //printf("a%d:%d ",i,a[i]); modify(a[i],1); } printf("Case #%d: ",time); for(int i=1;i<=n;i++){ printf("%d%c",right[i]-left[i]," \n"[i==n]); } } int main(){ int t; cin>>t; int i=0; while(i++<t){ memset(c,0,sizeof(c)); f(i); } return 0; }
相关文章推荐
- hdu5775 Bubble Sort(线段树求逆序数)
- HDU5775 Bubble Sort(树状数组求逆序数)
- HDU5775 Bubble Sort树状数组
- 树状数组 ( 求逆序数 )——Bubble Sort ( HDU 5775 ) ( 2016 Multi-University Training Contest 4 1012 )
- zoj 3157 计算几何 + 树状数组(逆序数)
- 51nod 1019 逆序数 (归并|树状数组)
- bestcoder#58 Inversion 即 hdu5497 (树状数组维护逆序数)
- hdu5775(2016多校第四场,线段树求逆序数)
- HDOJ 2492 Ping Pong 树状数组维护信息
- 逆序数(树状数组)
- poj3761 Bubble Sort(排列组合,逆序数,乘方取余)
- HDU2688 树状数组(逆序数)
- poj3264 树状数组维护区间最值
- 51nod 1019 逆序数(树状数组)
- BZOJ 3529 莫比乌斯反演 + 离线 + 树状数组动态维护前缀和
- 【BZOJ2124】等差子序列 树状数组维护hash值
- 2018年全国多校算法寒假训练营练习比赛(第五场)逆序数(树状数组)
- 【51Nod】1019 - 求逆序数(离散化 & 树状数组)
- 求逆序数的题-实现(归并排序和树状数组)
- HDU 5775 Bubble Sort (树状数组或线段树)