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 }
原文地址:https://www.cnblogs.com/acplayfacm/p/3861426.html