#include<stdio.h>
#include<string.h>
#define size 100111
int c[size],n;
int Lowbit(int k)
{
return (k&-k);
}
void update(int pos,int num)
{
while(pos<=size)//注意这里
{
c[pos]+=num;
pos+=Lowbit(pos);
}
}
int sum(int pos)
{
int s=0;
while(pos>0)
{
s+=c[pos];
pos-=Lowbit(pos);
}
return s;
}
int main()
{
int i,j,s;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,(n+3)*sizeof(c[0]));
for(i=1;i<=n;i++)
{
scanf("%d",&s);
update(s,1);
}
}
return 0;
}
二维:
#include<stdio.h>
#include<string.h>
const int N=10000;
int c[111][111];
int lowbit(int x)
{
return x&(-x);
}
void modify(int x,int y,int delta )
{
int i, j;
for(i=x;i<=N;i+=lowbit(i))
{
for(j=y; j<=N; j+=lowbit(j))
{
c[i][j] += delta;
}
}
}
int sum( int x, int y )
{
int res=0,i,j;
for(i=x;i>0;i-=lowbit(i))
{
for(j=y; j>0; j-=lowbit(j))
{
res += c[i][j];
}
}
return res;
}
求出任意一个子矩阵内的所有元素之和,即sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1)