百度有详细的解释线段树
poj2352
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 32001
using namespace std;
int res[M],d[M+1];
int lowbit(int x)
{
return x&(-x);//巧妙二进制
}
void update(int x)
{
while(x<=M)
{
d[x]+=1;
x+=lowbit(x);//父亲节点
}
}
int getsum(int x)
{
int s=0;
while(x>0)
{
s+=d[x];
x-=lowbit(x);//下一个控制点
}
return s;
}
int main()
{
int n,i,j;
#ifndef ONLINE_JUDGE
freopen("D:\\p.txt","r",stdin);
#endif // ONLINE_JUDGE
while(~scanf("%d",&n))
{
memset(res,0,sizeof(res));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
res[getsum(x+1)]++;//x可能为0,树状数组从1开始,因此加1,结果好控制
update(x+1);
}
for(i=0;i<n;i++)
printf("%d\n",res[i]);
}
return 0;
}
hdu1556
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 100001
using namespace std;
int sum[M];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int num)
{
while(x>0)
{
sum[x]+=num;
x-=lowbit(x);
}
}
int getsum(int x)
{
int s=0;
while(x<=M)
{
s+=sum[x];
x+=lowbit(x);
}
return s;
}
int main()
{
int n,i,j;
#ifndef ONLINE_JUDGE
freopen("D:\\p.txt","r",stdin);
#endif // ONLINE_JUDGE
while(scanf("%d",&n)&&n)
{
memset(sum,0,sizeof(sum));
for(i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
update(b,1);//1--b的区间加1
update(a-1,-1);//1--a-1的区间减1
}
for(i=1;i<n;i++)
printf("%d ",getsum(i));
printf("%d\n",getsum(n));
}
return 0;
}
poj2481
/*注意的地方就是区间是可以相同的*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
#define M 100002
using namespace std;
struct node
{
int x,y,index;
}q[M];
int n;
int tot[M],res[M];
bool cmp(node a,node b)
{
if(a.y==b.y)
return a.x<b.x;
return a.y>b.y;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x)
{
while(x<=M)
{
tot[x]++;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=0;
while(x>0)
{
ans+=tot[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
// freopen("D:\\nn.txt","r",stdin);
while(cin>>n,n)
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
q[i].index=i;
}
memset(tot,0,sizeof(tot));
sort(q+1,q+n+1,cmp);
//for(int i=1;i<=n;i++)
// printf("%d %d\n",q[i].x,q[i].y);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(i!=1&&q[i].x==q[i-1].x&&q[i].y==q[i-1].y)cnt++;else cnt=0;
res[q[i].index]=getsum(q[i].x+1);
update(q[i].x+1);
res[q[i].index]-=cnt;
}
for(int i=1;i<=n;i++)
{
if(i!=1)printf(" ");
printf("%d",res[i]);
}
puts("");
}
return 0;
}