HDU 3074
阿新 • • 發佈:2018-12-13
本題還是很簡單的。。線段樹模板。。重新複習了一下。。區間修改和乘法運算。。。注意取模就好。。
順便更新下模板。。。
以下是 AC 程式碼
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define ll long long int #define L(rt) (rt<<1) #define R(rt) (rt<<1|1) const int maxn = 1e6 + 5; const int mod = 1e9 + 7; int ans[maxn]; struct tree { int l,r; ll num; }sd[maxn]; void build(int l,int r,int rt) { sd[rt].l = l; sd[rt].r = r; if(l == r) { sd[rt].num = ans[l]; return; } int mid = (l+r)>>1; build(l,mid,L(rt)); build(mid+1,r,R(rt)); sd[rt].num = sd[L(rt)].num * sd[R(rt)].num % mod; } ll query(int l,int r,int rt) { if(sd[rt].l==l && sd[rt].r==r) return sd[rt].num; int mid=(sd[rt].l + sd[rt].r)>>1; if(r <= mid) { return query(l,r,L(rt)); } else if(l >= mid+1) { return query(l,r,R(rt)); } else { ll a=query(l,mid,L(rt)); ll b=query(mid+1,r,R(rt)); return (a*b)%mod; } } void update(int id,int val,int rt) { if(sd[rt].l == id && sd[rt].r == id) { sd[rt].num = val; return ; } if(id<=sd[L(rt)].r) update(id,val,L(rt)); if(id>=sd[R(rt)].l) update(id,val,R(rt)); sd[rt].num = (sd[L(rt)].num * sd[R(rt)].num) % mod; } int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&ans[i]); build(1,n,1); scanf("%d",&m); int ch,x,y; while(m--) { scanf("%d%d%d",&ch,&x,&y); if(ch == 0) { ll ant = query(x,y,1); printf("%d\n",ant % mod); } else { update(x,y,1); } } } return 0; }