zoukankan      html  css  js  c++  java
  • BZOJ 4631: 踩气球 线段树+vector

    一个区间在线段树中会被分成 $O(log n)$ 块,对于每一块都开一个 $vector$ 记录一下.

    然后在删除操作结束后如果影响到的区间变为全 $0$,就扫一遍对应的 $vector$.

    #include <cstdio> 
    #include <vector>  
    #include <string> 
    #include <cstring>
    #include <algorithm>  
    
    #define N 100006 
    #define lson now<<1 
    #define rson now<<1|1  
    
    using namespace std; 
    
    namespace IO { 
    
        void setIO(string s) 
        {
            string in=s+".in"; 
            string out=s+".out"; 
            freopen(in.c_str(),"r",stdin); 
            // freopen(out.c_str(),"w",stdout); 
        }
    
    }; 
     
    int ans;  
    
    int sum[N],A[N];  
    
    struct node {    
        int sum; 
        vector<int>v;   
    }s[N<<2];           
    
    void push(int l,int r,int now,int L,int R,int p) 
    {  
        if(l>=L&&r<=R) 
        {  
            ++sum[p];   
            s[now].v.push_back(p);  
            return; 
        }
        int mid=(l+r)>>1;  
        if(L<=mid)  push(l,mid,lson,L,R,p); 
        if(R>mid)   push(mid+1,r,rson,L,R,p);  
    }  
    
    void build(int l,int r,int now) 
    { 
        if(l==r)  
        {
            s[now].sum=A[l];  
            return; 
        } 
        int mid=(l+r)>>1;  
        build(l,mid,lson); 
        build(mid+1,r,rson); 
        s[now].sum=s[lson].sum+s[rson].sum;  
    } 
    
    void update(int l,int r,int now,int p) 
    {    
        --s[now].sum;                     
        if(!s[now].sum) 
        {
            for(int i=0;i<s[now].v.size();++i) 
            {
                --sum[s[now].v[i]];          
                if(!sum[s[now].v[i]]) ++ans;  
            }
        }
        if(l==r) return;   
        int mid=(l+r)>>1;   
        if(p<=mid)  update(l,mid,lson,p); 
        else update(mid+1,r,rson,p);  
    }
    
    int main() 
    { 
        // IO::setIO("input");  
        int i,j,n,m; 
        scanf("%d%d",&n,&m); 
        for(i=1;i<=n;++i)  scanf("%d",&A[i]);    
        build(1,n,1); 
        for(i=1;i<=m;++i) 
        {      
            int l,r; 
            scanf("%d%d",&l,&r);    
            push(1,n,1,l,r,i);  
        }
        int q; 
        scanf("%d",&q); 
        while(q--) 
        {     
            int x; 
            scanf("%d",&x); 
            x=(x+ans-1)%n+1;  
            update(1,n,1,x);    
            printf("%d
    ",ans);  
        }
        return 0; 
    }
    

      

  • 相关阅读:
    android studio学习----Android Studio导入github下载的工程--替换方法
    python+selenium 发送邮件
    vue 操作列的自定义
    vue作用域插槽实践
    vue左侧菜单的实现
    Django 解决跨域
    关于 with 语句
    docker
    python连接 ssh
    数据库建表 外键
  • 原文地址:https://www.cnblogs.com/guangheli/p/12118659.html
Copyright © 2011-2022 走看看