• CodeVs——T 4919 线段树练习4


    http://codevs.cn/problem/4919/

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    给你N个数,有两种操作

    1:给区间[a,b]内的所有数都增加X

    2:询问区间[a,b]能被7整除的个数

    输入描述 Input Description

    第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是add,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是count,表示统计区间[a,b]能被7整除的个数

    输出描述 Output Description

    对于每个询问输出一行一个答案

    样例输入 Sample Input

       

    3 
    2 3 4
    6
    count 1 3
    count 1 2
    add 1 3 2
    count 1 3
    add 1 3 3
    count 1 3
    样例输出 Sample Output

    0

    0

    0

    1

    数据范围及提示 Data Size & Hint

    10%:1<N<=10,1<Q<=10

    30%:1<N<=10000,1<Q<=10000

    100%:1<N<=100000,1<Q<=100000

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 const int N(100000+5);
     7 int n,x,y,z,q;
     8 
     9 #define lc (now<<1)
    10 #define rc (now<<1|1)
    11 #define mid (l+r>>1)
    12 struct AC_Tree
    13 {
    14     int val[7],flag;
    15 }tree[N<<2];
    16 inline void pushup(int now)
    17 {
    18     for(int i=0;i<7;i++)
    19         tree[now].val[i]=tree[lc].val[i]+tree[rc].val[i];
    20 }
    21 inline void pushdown(int now)
    22 {
    23     int temp[7],flag=tree[now].flag; tree[now].flag=0;
    24     tree[lc].flag+=flag; tree[rc].flag+=flag;
    25     for(int i=0;i<7;i++) temp[i]=tree[lc].val[i];
    26     for(int i=0;i<7;i++) tree[lc].val[((i+flag)%7)]=temp[i];
    27     for(int i=0;i<7;i++) temp[i]=tree[rc].val[i];
    28     for(int i=0;i<7;i++) tree[rc].val[((i+flag)%7)]=temp[i];
    29 }
    30 void Build(int now,int l,int r)
    31 {
    32     if(l==r)
    33     {
    34         scanf("%d",&x);
    35         tree[now].val[x%7]++;
    36         return ;
    37     }
    38     Build(lc,l,mid);
    39     Build(rc,mid+1,r);
    40     pushup(now);
    41 }
    42 void Change(int now,int l,int r,int L,int R,int x)
    43 {
    44     if(l==L&&r==R)
    45     {
    46         int temp[7];
    47         tree[now].flag+=x;
    48         for(int i=0;i<7;i++) temp[i]=tree[now].val[i];
    49         for(int i=0;i<7;i++) tree[now].val[(i+x)%7]=temp[i];
    50         return ;
    51     }
    52     if(tree[now].flag) pushdown(now);
    53     if(R<=mid) Change(lc,l,mid,L,R,x);
    54     else if(L>mid) Change(rc,mid+1,r,L,R,x);
    55     else Change(lc,l,mid,L,mid,x),Change(rc,mid+1,r,mid+1,R,x);
    56     pushup(now);
    57 }
    58 int Query(int now,int l,int r,int L,int R)
    59 {
    60     if(l==L&&r==R) return tree[now].val[0];
    61     if(tree[now].flag) pushdown(now);
    62     if(R<=mid) return Query(lc,l,mid,L,R);
    63     else if(L>mid) return Query(rc,mid+1,r,L,R);
    64     else return Query(lc,l,mid,L,mid)+Query(rc,mid+1,r,mid+1,R);
    65 }
    66 
    67 int main()
    68 {
    69     scanf("%d",&n);
    70     Build(1,1,n);
    71     scanf("%d",&q);
    72     for(char s[5];q--;)
    73     {
    74         scanf("%s%d%d",s,&x,&y);
    75         if(s[0]=='a')
    76         {
    77             scanf("%d",&z);
    78             Change(1,1,n,x,y,z);
    79         }
    80         else printf("%d
    ",Query(1,1,n,x,y));
    81     }
    82     return 0;
    83 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    VS提示“项目文件" "已被重命名或已不在解决方案中”的解决办法 .
    微信公众平台教程和SDK收集
    “SQLServerAgent当前未运行”问题解决
    $(document).click() 在苹果手机上不能正常运行
    友盟iOS推送配置(从真机调试到推送)
    Ubuntu安装VMware Tools的方法
    TortoiseSVN客户端如何更改新的URL
    Windows Server 2008系统如何取消登录时要按Ctrl+Alt+Delete组合键
    Windows Server 2008 显示桌面图标
    用WinRAR进行安装包的制作
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7263973.html
Copyright © 2020-2023  润新知