1.分块思想:
2.树状数组
int getSum(int x
)
{
int sum
=0;
for(int i
=x
; i
>0; i
-=lowbit(i
))
{
sum
+=c
[i
];
}
return sum
;
}
void update(int x
, int v
)
{
for(int i
=x
; i
<=n
; i
+=lowbit(i
))
c
[i
]+=v
;
}
数状数组最经典的应用
#include<iostream>
using namespace std
;
const int maxn
=10;
#define lowbit(i) ((i)&(-i))
int n
;
int c
[maxn
]={0};
void update(int x
, int v
)
{
for(int i
=x
; i
<maxn
; i
+=lowbit(i
))
{
c
[i
]+=v
;
}
}
int getNum(int x
)
{
int sum
=0;
for(int i
=x
; i
>0; i
-=lowbit(i
))
{
sum
+=c
[i
];
}
return sum
;
}
int main()
{
cin
>> n
;
int temp
;
for(int i
=0; i
<n
; i
++)
{
cin
>> temp
;
update(temp
,1);
cout
<< getNum(temp
-1) << endl
;
}
}
采用离散化的方式统计序列中在元素左边比该元素小的数字
#include<iostream>
#include<cstring>
using namespace std
;
const int maxn
=20;
#define lowbit(i) ((i)&(-i))
int c
[maxn
];
void update(int x
,int v
)
{
for(int i
=x
; i
<maxn
; i
+=lowbit(i
))
{
c
[i
]+=v
;
}
}
int getNum(int x
)
{
int sum
=0;
for(int i
=x
; i
>0; i
-=lowbit(i
))
{
sum
+=c
[x
];
}
return sum
;
}
int main()
{
int n
;
cin
>> n
;
int temp
;
memset(c
,0,sizeof(c
));
for(int i
=0; i
<n
; i
++)
{
cin
>> temp
;
update(temp
,1);
cout
<< getNum(temp
-1) << endl
;
}
}
转载请注明原文地址: https://lol.8miu.com/read-19655.html