题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3074
非常简单的一个线段树单点更新求区间的模板题,只需要把平时存放区间和的数组sum[]用来表示区间的成绩,将Query求和函数,改成求累积即可。
还有一个问题就是,我在hudoj上用C++交会TLE,但是换成G++就AC了,不知道怎么回事e。
有点小问题的ac代码:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include<set> 8 #include 9 #include 10 #include 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 }