题是树状数组模板题,要明白树状数组的操作原理以及改变方向,此题迎刃而解;具体看代码
#include<iostream>
#include <string.h>
using namespace std;
int n;
int c[100500];
int lowbit(int x)
{
return x&-x;
}
void update (int x,int sum)
{
while (x<=n)
{
c[x]+=sum;
x+=lowbit(x);
}
}
int get_sum(int x)
{
int sum=0;
while (x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int a,b;
while (scanf("%d",&n)!=EOF&&n)
{
int nu=n;
memset(c,0,sizeof(c));
while(nu--)
{
scanf("%d%d",&a,&b);
update(a,1); //将a节点以上加1,
update(b+1,-1);//将b节点以上减一, 最终结果是a与b间加一,最后直接输出get_sum(i)即为结果
}
for (int i=1;i<=n;i++)
{
if (i!=1)
printf(" ");
printf("%d",get_sum(i));
}
cout<<endl;
}
return 0;
}