zoukankan      html  css  js  c++  java
  • codevs 4919 线段树练习4

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 100010
    using namespace std;
    int n,m,num,a[maxn],tmp[maxn];
    char s[100];
    struct node
    {
        int l,r;
        int lc,rc;
        int s[7],bj;
    }t[maxn*2+100];
    int init()
    {
        int x=0;char s;bool f=0;s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        if(f==1)return -x;return x;
    }
    void sum(int k)
    {
        for(int i=0;i<=6;i++)
          t[k].s[i]=t[t[k].lc].s[i]+t[t[k].rc].s[i];
    }
    void down(int k,int p)
    {
        //int tmp[maxn];
        //memset(tmp,0,sizeof(tmp));这玩意耗时间 会T 
        for(int i=0;i<=6;i++)
          tmp[(i+p)%7]=t[k].s[i];
        for(int i=0;i<=6;i++)
          t[k].s[i]=tmp[i];
    }
    void update(int k)
    {
        down(t[k].lc,t[k].bj);
        down(t[k].rc,t[k].bj);
        t[t[k].lc].bj=t[k].bj+t[t[k].lc].bj;
        t[t[k].rc].bj=t[k].bj+t[t[k].rc].bj;
        t[k].bj=0;
    }
    void Build(int ll,int rr)
    {
        int k=++num;
        t[k].l=ll;t[k].r=rr;
        if(ll!=rr-1)
          {
              t[k].lc=num+1;
              Build(ll,(ll+rr)/2);
              t[k].rc=num+1;
              Build((ll+rr)/2,rr);
              sum(k);
          }
        else t[k].s[a[ll]]++;
    }
    void change(int k,int ll,int rr,int p)
    {
        if(ll<=t[k].l&&rr>=t[k].r)
          {
              t[k].bj=(t[k].bj+p)%7;
              down(k,p);
              return;
          }
        if(t[k].bj)update(k);
        int mid=(t[k].l+t[k].r)/2;
        if(ll<mid)change(t[k].lc,ll,rr,p);
        if(rr>mid)change(t[k].rc,ll,rr,p);
        sum(k);
    }
    int find(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].s[0];
        int ans=0;
        if(t[k].bj)update(k);
        int mid=(t[k].l+t[k].r)/2;
        if(ll<mid)ans+=find(t[k].lc,ll,rr);
        if(rr>mid)ans+=find(t[k].rc,ll,rr);
        return ans;
    }
    int main()
    {
        n=init();
        int x,y,z;
        for(int i=1;i<=n;i++)
          {
              x=init();
              a[i]=x%7;
          }
        Build(1,1+n);
        m=init();
        for(int i=1;i<=m;i++)
          {
              scanf("%s",s);
              if(s[0]=='c')
                {
                    x=init();y=init();
                    printf("%d
    ",find(1,x,y+1));
              }
            if(s[0]=='a')
              {
                  x=init();y=init();z=init();
                  change(1,x,y+1,z%7);
              }
          }
        return 0;
    }
  • 相关阅读:
    Java 线程池概念、原理、简单实现
    Java 中的等待唤醒机制透彻讲解
    Java 多线程安全问题简单切入详细解析
    理解 Java 多线程
    Java 异常的处理
    Android MediaPlayer的生命周期
    Node.js 撸第一个Web应用
    Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》
    使用Intent传递对象
    Android 异步查询框架AsyncQueryHandler的使用
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5498432.html
Copyright © 2011-2022 走看看