View Code
#include<iostream> using namespace std; const int M=100000+9; struct treenode { int left;//左区间 int right;//右区间 int sum; //区间之和 }node[M*3];//节点数大约是最大区间的3被 void build(int low,int top,int index)//功能:建树 { node[index].left=low; node[index].right=top; node[index].sum=0; if(low==top) //是否递归到最低层 { return ; } int mid=(low+top)/2; build(low,mid,index*2); build(mid+1,top,index*2+1); return ; } void updata(int low,int top,int index)//在区间节点上加1 { int mid; if(low==node[index].left&&top==node[index].right) { node[index].sum++; } else { mid=(node[index].left+node[index].right)>>1; if(top<=mid) //左子树 updata(low,top,index*2); else if(low>mid) //右子树 updata(low,top,index*2+1); else //左右都存在 { updata(low,mid,index*2); updata(mid+1,top,index*2+1); } } } int search(int low,int top,int index,int sum)//sum的作用是在找最底层时经过的节点要加到最底层的node[].sum上 { if(node[index].left==low&&node[index].right==top) return node[index].sum+sum; int mid=(node[index].left+node[index].right)/2; if(top<=mid) { return search(low,top,index*2,sum+node[index].sum); } else return search(low,top,index*2+1,sum+node[index].sum); } int main() { int t; while(cin>>t,t) { int i,j; memset(node,0,sizeof(node)); build(1,t,1); int a,b; for(i=0;i<t;i++) { cin>>a>>b; updata(a,b,1); } for(i=1;i<t;i++) cout<<search(i,i,1,0)<<" "; cout<<search(t,t,1,0)<<endl; } return 0; } /* 3 1 1 2 2 3 3 3 1 1 1 2 1 3 */
题意:中文题,此处省。
ac代码: