http://acm.hdu.edu.cn/showproblem.php?pid=1556
可以说这是线段树的水题了么...
注意输出格式 最后没有空格
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 100010
using namespace std;
typedef struct
{
int l;
int r;
int sum;
int cnt; //加法
} Tree;
Tree tree[MAX*10];
int i,j,k,m,n,x,y,ch;
void update(int i) //更新
{
if(tree[i].cnt!=0)
{
tree[i].sum=((tree[i].sum)+((tree[i].r-tree[i].l+1)*tree[i].cnt)); //求和
tree[i*2].cnt =(tree[i*2].cnt + tree[i].cnt);
tree[i*2+1].cnt=(tree[i*2+1].cnt + tree[i].cnt);
tree[i].cnt=0;
}
}
int build(int i,int l,int r)
{
int mid;
tree[i].l=l;
tree[i].r=r;
tree[i].sum=0;
tree[i].cnt=0;
if(l==r)
return 0;
mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}
int ins(int i,int x,int y)
{
int mid;
update(i);
if ((x<=tree[i].l)&&(y>=tree[i].r))
{
tree[i].cnt=(tree[i].cnt+1);
return 0;
}
mid=(tree[i].l+tree[i].r)/2;
if (x<=mid) ins(i*2, x,y);
if (y>mid) ins(i*2+1,x,y);
update(i*2);
update(i*2+1);
tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum);
}
int cal(int i,int x,int y)//计算
{
int mid;
int ans;
update(i);
if ((x<=tree[i].l)&&(y>=tree[i].r))
return (tree[i].sum);
ans=0;
mid=(tree[i].l+tree[i].r)/2;
if (x<=mid) ans=(ans+cal(i*2,x,y));
if (y>mid) ans=(ans+cal(i*2+1,x,y));
update(i*2);
update(i*2+1);
tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum);
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
if(n==0)
break;
build(1,1,n);
for (i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
ins(1,x,y);
}
for(i=1; i<n; i++)
printf("%d ",cal(1,i,i));
printf("%d",cal(1,n,n));
printf("\n");
}
}