zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    找零钱「Usaco2006 Dec」
    才艺表演「Usaco2018 Open」
    潜入行动「JSOI2018」
    任务安排「SDOI2012」
    BZOJ2298: [HAOI2011]problem a
    JZOJ 5818
    JZOJ 3493
    JZOJ 3470
    JZOJ 5781
    JZOJ 5778
  • 原文地址:https://www.cnblogs.com/acplayfacm/p/3861426.html
Copyright © 2011-2022 走看看