简单线段树插入和查询删除
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 }
ACM基础训练题解4302 丢失的牛,布布扣,bubuko.com
时间: 2024-10-29 19:08:36