题意:
当N = 0,输入结束。
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
1 1 1 3 2 1
线段树:
这道题计数的时候不需要一定记到叶子节点(就靠这个来省时间)
最后返值得时候
tree[n*2].value+=tree[n].value;
tree[n*2+1].value+=tree[n].value;
就可以了
//
// main.cpp
// BALl
//
// Created by Mr.Xue on 17/7/19.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespacestd;
int ans[100005],m;
struct node
{
int l,r,value;
}tree[500000];
void buildTree(int l,int r,int n)
{
tree[n].l=l;
tree[n].r=r;
tree[n].value=0;
if(l==r)
return;
int mid=(l+r)/2;
buildTree(l,mid,n*2);
buildTree(mid+1,r,n*2+1);
}
void qurry(int l,int r,int n)
{
if(l==tree[n].l&&r==tree[n].r)
{
tree[n].value++;
return;
}
int mid=(tree[n].l+tree[n].r)/2;
if(mid>=r)
qurry(l,r,n*2);
else if(mid<l)
qurry(l,r,n*2+1);
else
{
qurry(l,mid,n*2);
qurry(mid+1,r,n*2+1);
}
}
void get(int n)
{
if(tree[n].l==tree[n].r)
{
ans[++m]=tree[n].value;
return;
}
tree[n*2].value+=tree[n].value;
tree[n*2+1].value+=tree[n].value;
get(n*2);
get(n*2+1);
}
int main()
{
int n,a,b;
while(scanf("%d",&n)&&n!=0)
{
m=0;
buildTree(1,n,1);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a,&b);
qurry(a,b,1);
}
get(1);
for(int i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return0;
}