标签:
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3074
题目大意:单点更新。维护序列乘法。mod 1000000007。
解题思路:
1000000007*1000000007~10^18<9*10^18(int64)
所以单步模P乘法可以直接计算。
(a*b)%p=[(a%p)*(b%p)]%p,PushUp维护即可。
Query的rson的时候,要先判下lson是否存在,不存在ret=Query(rson),否则ret=(Query(lson)*Query(rson))%p
#include "iostream" #include "string" #include "vector" #include "cstring" #include "fstream" #include "cstdio" using namespace std; #define M 100005 #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define LL long long #define mod 1000000007 LL ans[M<<2]; void PushUp(int root) { LL a=ans[root<<1]%mod,b=ans[root<<1|1]%mod; ans[root]=(a*b)%mod; } void build(int l,int r,int root) { if(l==r) { scanf("%I64d",&ans[root]); return; } int mid=(l+r)>>1; build(lson); build(rson); PushUp(root); } void update(int p,int value,int l,int r,int root) { if(l==r) { ans[root]=value; return; } int mid=(l+r)>>1; if(p<=mid) update(p,value,lson); else update(p,value,rson); PushUp(root); } LL Query(int L,int R,int l,int r,int root) { if(L<=l&&r<=R) return ans[root]%mod; int mid=(l+r)>>1; LL ret=-1; if(L<=mid) ret=Query(L,R,lson); if(R>mid) { LL rr=Query(L,R,rson); if(ret!=-1) { LL a=ret%mod,b=rr%mod; ret=(a*b)%mod; } else ret=rr; } return ret; } int main() { //freopen("in.txt","r",stdin); int n,q,ll,rr,p,k,v,cmd; int T;scanf("%d",&T); while(T--) { scanf("%d",&n); build(1,n,1); scanf("%d",&q); while(q--) { scanf("%d",&cmd); if(cmd==1) { scanf("%d%d",&k,&v); update(k,v,1,n,1); } if(cmd==0) { scanf("%d%d",&ll,&rr); LL ans=Query(ll,rr,1,n,1); printf("%I64d\n",ans%mod); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/neopenx/p/4501058.html