• hdu-3074 Multiply game---线段树+单点更新


    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=3074

    题目大意:

    给一些数,进行点更新或者是区间计算乘积

    解题思路:

    裸的线段树,注意空间开大点

     1 #include<bits/stdc++.h>
     2 #define MID(l, r) ((l) + ((r) - (l)) / 2)
     3 #define lson(o) ((o)<<1)
     4 #define rson(o) ((o)<<1|1)
     5 using namespace std;
     6 typedef long long ll;
     7 const int maxn = 1e6 + 10;
     8 const int mod = 1e9 + 7;
     9 struct node
    10 {
    11     ll l, r, sum;
    12 }tree[maxn];
    13 ll a[maxn];
    14 void build(int o, int l, int r)
    15 {
    16     tree[o].l = l, tree[o].r = r;
    17     if(l == r)
    18     {
    19         tree[o].sum = a[l];
    20         return;
    21     }
    22     int m = MID(l, r);
    23     int lc = lson(o), rc = rson(o);
    24     build(lc, l, m);
    25     build(rc, m + 1, r);
    26     tree[o].sum = tree[lc].sum * tree[rc].sum % mod;
    27 }
    28 
    29 int ql, qr;//查询区间[ql, qr]中的max,min,sum
    30 ll ans_sum;
    31 void query(int o)
    32 {
    33     if(ql <= tree[o].l && qr >= tree[o].r)//[L, R]包含在[ql, qr]区间内,直接用该节点的信息,达到线段树查询快的操作
    34     {
    35         ans_sum *= tree[o].sum;
    36         ans_sum %= mod;
    37         return;
    38     }
    39     int m = MID(tree[o].l, tree[o].r);
    40     if(ql <= m)query(lson(o));
    41     if(qr > m)query(rson(o));
    42 }
    43 
    44 //单点更新,a[p] += v;
    45 int p, v;
    46 void update(int o)
    47 {
    48     if(tree[o].l == tree[o].r)
    49     {
    50         tree[o].sum = v;
    51         return;
    52     }
    53     int m = MID(tree[o].l, tree[o].r);
    54     int lc = lson(o), rc = rson(o);
    55     if(p <= m)update(lc);
    56     else update(rc);
    57     tree[o].sum = tree[lc].sum * tree[rc].sum % mod;
    58 }
    59 
    60 int main()
    61 {
    62     int T;
    63     scanf("%d", &T);
    64     while(T--)
    65     {
    66         int n;
    67         scanf("%d", &n);
    68         for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
    69         build(1, 1, n);
    70         int q, f, l, r;
    71         scanf("%d", &q);
    72         while(q--)
    73         {
    74             scanf("%d%d%d", &f, &l, &r);
    75             if(f)
    76             {
    77                 p = l, v = r;
    78                 update(1);
    79             }
    80             else
    81             {
    82                 ql = l, qr = r;
    83                 ans_sum = 1;
    84                 query(1);
    85                 printf("%lld
    ", ans_sum);
    86             }
    87         }
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    ADHOC Report 配置
    html tags
    Stingray验证机制
    常用jQuery知识
    Communication API
    stingray前端架构总体设计及运行过程
    REP report开发技巧
    WorkFlow业务介绍
    MySQL auto_increment初始值设置
    SQL Server中order by的使用,我们来填坑
  • 原文地址:https://www.cnblogs.com/fzl194/p/9074263.html
Copyright © 2020-2023  润新知