HDU3074-Multiply game(线段树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3074

非常简单的一个线段树单点更新求区间的模板题,只需要把平时存放区间和的数组sum[]用来表示区间的成绩,将Query求和函数,改成求累积即可。

还有一个问题就是,我在hudoj上用C++交会TLE,但是换成G++就AC了,不知道怎么回事e。

有点小问题的ac代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<map>
  6 #include<queue>
  7 #include<set>
  8 #include<cmath>
  9 #include<list>
 10 #include<cstring>
 11 #include<string>
 12 #define ll long long
 13 #define ull unsigned long long
 14 #define inf 0x3f3f3f3f
 15 #define inff 0x7fffffff
 16 using namespace std;
 17 const int N = 50000 + 10;
 18 const int M = 1000000 + 10;
 19 const ll mod = 1e9 + 7;
 20 
 21 ll a[N];
 22 ll sum[N << 2];
 23 int add[N << 2];
 24 char ch[10];
 25 
 26 void PushUp(int rt) {
 27     sum[rt] = (sum[rt << 1] * sum[rt << 1 | 1]) % mod;
 28 }
 29 
 30 void Build(int l, int r, int rt) {
 31 
 32     if (l == r) {
 33         sum[rt] = a[l];
 34         return;
 35     }
 36     int mid = (l + r) >> 1;
 37     Build(l, mid, rt << 1);
 38     Build(mid + 1, r, rt << 1 | 1);
 39     PushUp(rt);
 40 
 41     return;
 42 }
 43 
 44 void PointUpdate(int L, int C, int l, int r, int rt) {
 45 
 46     if (l == r) {
 47         sum[rt] = C;
 48         return;
 49     }
 50     int mid = (l + r) >> 1;
 51     if (L <= mid) PointUpdate(L, C, l, mid, rt << 1);
 52     else PointUpdate(L, C, mid + 1, r, rt << 1 | 1);
 53     PushUp(rt);
 54 
 55     return;
 56 }
 57 
 58 ll Query(int L, int R, int l, int r, int rt) {
 59     
 60     if (l >= L && r <= R) {
 61         return sum[rt];
 62     }
 63     int mid = (l + r) >> 1;
 64 
 65     ll ans = 1;
 66     if (L <= mid) ans = (ans * Query(L, R, l, mid, rt << 1)) % mod;
 67     if (R > mid) ans = (ans * Query(L, R, mid + 1, r, rt << 1 | 1)) % mod;
 68     //PushUp(rt);
 69 
 70     return ans;
 71 }
 72 
 73 int main() {
 74 
 75     ios::sync_with_stdio(false);
 76     cin.tie(0);
 77     int T;
 78     cin >> T;
 79     while (T--) {
 80         int n;
 81         cin >> n;
 82         for (int i = 1; i <= n; i++) {
 83             cin >> a[i];
 84         }
 85         Build(1, n, 1);
 86         int q;
 87         cin >> q;
 88         while (q--) {
 89             int p, x, y;
 90             cin >> p >> x >> y;
 91             if (p == 0) {
 92                 cout << Query(x, y, 1, n, 1) % mod << "\n";
 93             }
 94             else {
 95                 PointUpdate(x, y, 1, n, 1);
 96             }
 97         }
 98     }
 99 
100     return 0;
101 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值