码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-23 00:08:00      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:col   its   can   update   lse   单点   query   ble   nbsp   

题目链接:

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\n", ans_sum);
86             }
87         }
88     }
89     return 0;
90 }

 

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

标签:col   its   can   update   lse   单点   query   ble   nbsp   

原文地址:https://www.cnblogs.com/fzl194/p/9074263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!