题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556
#include<cstdio> using namespace std; struct node { int start; int end; int num; }; node q[500000]; void built(int s,int e,int key) { q[key].start=s; q[key].end=e; q[key].num=0; if(s==e) { return; } int mid=(s+e)/2; built(s,mid,2*key); built(mid+1,e,2*key+1); } void updata(int i,int j,int key) { if(q[key].start==i&&q[key].end==j) { q[key].num++; return; } int mid=(q[key].start+q[key].end)/2; if(i<=mid&&j>mid) { updata(i,mid,2*key); updata(mid+1,j,2*key+1); } else { if(i<=mid) updata(i,j,2*key); if(j>mid) updata(i,j,2*key+1); } } void insert(int i,int j,int key) { if(key!=1) q[key].num+=q[key/2].num; if(q[key].start==q[key].end) { return; } int mid=(q[key].start+q[key].end)/2; if(i<=mid) insert(i,j,2*key); if(j>mid) insert(i,j,2*key+1); } int check(int i,int key) { if(q[key].start==q[key].end) return q[key].num; int mid=(q[key].start+q[key].end)/2; if(i<=mid) check(i,2*key); else check(i,2*key+1); } int main() { int N,a,b,i; while(scanf("%d",&N)&&N) { built(1,N,1); for(i=1;i<=N;i++) { scanf("%d%d",&a,&b); updata(a,b,1); } insert(1,N,1); printf("%d",check(1,1)); for(i=2;i<=N;i++) printf("% d",check(i,1)); printf(" "); } return 0; }