hdu-3074 Multiply game---线段树+单点更新
Posted 努力努力再努力x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", ans_sum); 86 } 87 } 88 } 89 return 0; 90 }
以上是关于hdu-3074 Multiply game---线段树+单点更新的主要内容,如果未能解决你的问题,请参考以下文章