zoukankan      html  css  js  c++  java
  • 草稿

    #include <cstdio> 
    #include <cstring> 
    #include <algorithm> 
    #define N 1000007  
    #define ll long long 
    #define lson now<<1 
    #define rson now<<1|1   
    #define setIO(s) freopen(s".in","r",stdin)  
    using namespace std; 
    const int uni=(1<<30)-1;   
    int bin[31],tag[N<<2],val[N<<2];     
    struct data  {      
        int f0,f1,len;  
        data() {f0=0,f1=0;}  
        data operator+(const data b) const {  
            data c;   
            c.len=len+b.len;   
            c.f0=f0,c.f1=f1;  
            if(f0==len) c.f0+=b.f0; 
            if(f1==len) c.f1+=b.f1;   
            return c;  
        }
    }s[N<<2];      
    void mark(int now,int v) {    
        tag[now]=v; 
        if(v==1) {   
            s[now].f0=0;  
            s[now].f1=s[now].len;
        }  
        else {
            s[now].f0=s[now].len; 
            s[now].f1=0;  
        }
        if(s[now].len==1) {     
            val[now]=(v?uni:0);  
        }
    }     
    void pushdown(int now) {   
        if(tag[now]!=-1) {  
            mark(lson,tag[now]); 
            mark(rson,tag[now]); 
            tag[now]=-1;  
        }
    }
    void build(int l,int r,int now) { 
        s[now].len=r-l+1;  
        s[now].f0=s[now].len; 
        s[now].f1=0;  
        tag[now]=-1;  
        if(l==r) { 
            return; 
        }
        int mid=(l+r)>>1;  
        build(l,mid,lson),build(mid+1,r,rson);  
    }
    void uptag(int l,int r,int now,int L,int R,int v) { 
        if(l>=L&&r<=R) { 
            mark(now,v); 
            return; 
        }
        pushdown(now); 
        int mid=(l+r)>>1;  
        if(L<=mid) uptag(l,mid,lson,L,R,v);  
        if(R>mid)  uptag(mid+1,r,rson,L,R,v);  
        s[now]=s[lson]+s[rson];  
    }   
    void upval(int l,int r,int now,int p,int v) { 
        if(l==r) {  
            val[now]+=v;  
            if(val[now]<0) { 
                val[now]+=bin[30];  
            }    
            val[now]&=uni;    
            int flag=(val[now]&1),p;  
            s[now].f0=s[now].f1=0; 
            if(flag) s[now].f1=1;
            else s[now].f0=1; 
            for(int i=1;i<=29;++i) { 
                p=(val[now]&(1<<i))>0;  
                if(p^flag) break;  
                if(flag) ++s[now].f1;  
                else ++s[now].f0;       
            }
            return; 
        }       
        pushdown(now); 
        int mid=(l+r)>>1;    
        if(p<=mid) upval(l,mid,lson,p,v); 
        else upval(mid+1,r,rson,p,v); 
        s[now]=s[lson]+s[rson];  
    }
    int qval(int l,int r,int now,int p) { 
        if(l==r) return val[now];   
        pushdown(now); 
        int mid=(l+r)>>1;   
        if(p<=mid) return qval(l,mid,lson,p); 
        else return qval(mid+1,r,rson,p);  
    }   
    data query(int l,int r,int now,int L,int R) { 
        if(l>=L&&r<=R) { 
            return s[now]; 
        } 
        pushdown(now); 
        int mid=(l+r)>>1;  
        if(L<=mid&&R>mid) return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);  
        else if(L<=mid)   return query(l,mid,lson,L,R);  
        else return query(mid+1,r,rson,L,R);  
    }
    void init() { 
        for(int i=0;i<31;++i) bin[i]=1<<i; 
    } 
    void ADD(int x,int y) { 
        // x 块上加上 y   
        int ori=qval(1,n,1,x);   
        upval(1,n,1,x,y);  
        if(ori+y>uni) {  
            node p=query(1,n,1,x+1,n);    
            if(p.f1) {          
                uptag(1,n,1,x+1,x+p.f1,0);   
            }
            upval(1,n,1,x+1+p.f1,1);  
        }
    } 
    void DEC(int x,int y) { 
        int ori=qval(1,n,1,x);  
        upval(1,n,1,x,-y);  
        if(ori-y<0) {    
            node p=query(1,n,1,x+1,n);  
            if(p.f0) {    
                uptag(1,n,1,x+1,x+p.f0,1);   
            }   
            upval(1,n,1,x+1+p.f0,-1);    
        }
    }
    int main() { 
        setIO("input");  
        init();  
        int m,x,y,z;  
        scanf("%d%d%d%d",&m,&x,&y,&z);  
        for(int i=1;i<=m;++i) { 
            scanf("%d",&z);  
            if(z==1) {  
                scanf("%d%d",&x,&y);  
                if(!x) continue;  
                int rx=abs(x);   
                
            } 
            else {      
                scanf("%d",&x);  
            }
        }
        return 0; 
    }
    

      

  • 相关阅读:
    Vim 在 windows 环境下的初步配置
    空间向量在任意平面的投影公式推导 (矩阵方法)
    jquery中获取元素的几种方式小结
    开源框架
    将插入的新行放入dataGridView的第一行
    go-mod 入门
    docker 常用启动命令
    golang str 首字母大写
    遇到过的几个难搞的问题
    jwt、session、oauth 异同
  • 原文地址:https://www.cnblogs.com/guangheli/p/12054321.html
Copyright © 2011-2022 走看看