• poj 3468 A Simple Problem with Integers


    今天的难度又增加了,在好不容易把练习A了以后,才发现,昨天的题根本就不叫题,我一口气刷得就剩一题了。只能说,攻克变态题的方法,就是去做更变态的题,然后原来的题就不变态了……

    今天的作业,我的收获是,change、pushdown等涉及数据的函数的关键内容,是要随题目变化的。

     1 #include <stdio.h>
     2 const int N = 100005;
     3 long long sum[4*N];
     4 long long add[4*N];
     5 int D;
     6 void update(int cur)
     7 {
     8     sum[cur] = sum[cur<<1] + sum[cur<<1|1];
     9 }
    10 void pushdown(int cur, int x, int y)
    11 {
    12     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
    13     if(add[cur])
    14     {
    15         add[lc] += add[cur];
    16         add[rc] += add[cur];
    17         sum[lc] += add[cur] *(mid-x+1);
    18         sum[rc] += add[cur] *(y - mid);
    19         add[cur] = 0;
    20     }
    21 }
    22 void build(int cur,int x,int y)
    23 {
    24     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
    25     if(x == y)
    26     {
    27         add[cur] = 0;
    28         return ;
    29     }
    30     build(lc,x,mid);
    31     build(rc,mid+1,y);
    32     update(cur);
    33 }
    34 void query(int cur,int x,int y,int s,int t,long long & ans)
    35 {
    36     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
    37     if(x >= s && y <= t)
    38     {
    39         ans += sum[cur];
    40         return ;
    41     }
    42     pushdown(cur,x,y);
    43     if(s <= mid)
    44         query(lc,x,mid,s,t,ans);
    45     if(t >= mid+1)
    46         query(rc,mid+1,y,s,t,ans);
    47 }
    48 void Add(int cur,int x,int y,int s,int t,int v)
    49 {
    50     int mid=(x+y)>>1,lc = cur<<1,rc = lc|1;
    51     if(x >= s && y <= t)
    52     {
    53         add[cur] += v;
    54         sum[cur] += v * (y-x+1);
    55         return ;
    56     }
    57     pushdown(cur,x,y);
    58     if(s <= mid)
    59         Add(lc,x,mid,s,t,v);
    60     if(t >= mid+1)
    61         Add(rc,mid+1,y,s,t,v);
    62     update(cur);
    63 }
    64 int main()
    65 {
    66     int m,n,i,x,y,v;
    67     long long ans;
    68     char ch;
    69     while(~scanf("%d%d",&n,&m))
    70     {
    71         for(D = 1; D < n; D <<= 1);
    72         for(i = 0; i < n; i++)
    73             scanf("%lld",&sum[D+i]);
    74         //for(i = 1; i <= n; i++)
    75             //cin>>a[i];
    76         build(1,1,D);
    77         while(m--)
    78         {
    79             getchar();
    80             scanf("%c",&ch);
    81             if(ch == 'Q')
    82             {
    83                 ans = 0;
    84                 scanf("%d%d",&x,&y);
    85                 query(1,1,D,x,y,ans);
    86                 printf("%lld\n",ans);
    87             }
    88             else
    89             {
    90                 scanf("%d%d%d",&x,&y,&v);
    91                 Add(1,1,D,x,y,v);
    92             }
    93         }
    94     }
    95     return 0;
    96 }

    今天又偷懒了,一到晚上就开始玩,想做题也没状态了,希望下次能改吧。

  • 相关阅读:
    hdu1159 LCS模板题
    RabbitMQ入门
    Dubbo
    SpringMVC
    MySQL的再理解
    ElasticSearch
    redis入门学习
    Swagger
    SSM整合
    MybatisPlus
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2588900.html
Copyright © 2020-2023  润新知