首页 > 代码库 > ACM基础训练题解4302 丢失的牛

ACM基础训练题解4302 丢失的牛

简单线段树插入和查询删除

 1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 using namespace std; 5 int num[10000]; 6 int node[20000]; 7 int scale; 8 void clear(int n){ 9     scale=1;10     while(scale<=n+1)11       scale=scale<<1;12     memset(node,0,sizeof(node));13     for(int i=scale+1;i<=scale+n;i++)14         node[i]=1;15     for(int i=scale-1;i>=1;i--)16        node[i]=node[i+i]+node[i+i+1];17     return ;18 } 19 int insert(int loc){20     int p=1;21     while(p<scale){22         node[p]--;23         if(node[p<<1]-loc>0)24            p+=p;25         else {26             loc-=node[p<<1];27             p=p+p+1;28         }    29     }30     node[p]=0;31     return (p-scale);32 }33 int main(){34     int n;35     cin>>n;36     clear(n);37     num[1]=0;38     for(int i=2;i<=n;i++)39        cin>>num[i];40     for(int i=n;i>=1;i--)41        num[i]=insert(num[i]);42     for(int i=1;i<=n;i++)43       cout<<num[i]<<endl;44     return 0;45 }